前天終於摸懂julia要怎麼包成套件的形式並且做測試orz...............
他包成套件之後真的很好測試!!
打開julia console,他本身就有內建套件管理程式Pkg
,如果要開發套件的話請先安裝PkgDev
:
Pkg.add("PkgDev")
這會自動從網路上下載並且安裝PkgDev
套件,然後使用套件的話:
using PkgDev
接著,如果要創造一個叫作FooBar的套件的話:
PkgDev.generate("FooBar", "MIT")
第一個參數是你的套件名稱,後面的那個是你的opensource license。
julia會自動在你的<家目錄>/.julia/<版本>/
下創一個FooBar
的資料夾,資料夾結構如下:
我是在Arch linux下測試的。
這邊官方文件沒想讓我有點頭痛,這邊是看github上各種套件的結構得出來的結論
### src/FooBar.jl
__precompile__() # 這可以在你載入套件的時候預先編譯
module <套件名稱> # 記得套件的內容要縮排!!
export # 這邊export的意思是把套件裡寫好的方法或是型別public出去給使用者
program, # 沒有列上來的,使用者就看不到喔~~
CoolingScheduler,
StabilityCounter,
.....
include("cooling.jl") # 因為所有功能不可能都寫在同一個檔案裏面
include("stable.jl") # 所以會寫在其他檔案裏面再include進來
include("state.jl") # 上面export列到的都是這些檔案裡定義的喔!
.....
end # module
其他檔案的寫法(其實就是直接寫就好了),如果有用到其他檔案裡的東西的話,直接寫!不用掛檔案名稱!
### src/stable.jl
doc"""
Stability Counter
"""
type StabilityCounter
counter::Int64
..........
function StabilityCounter(halt=150::Int64, abs_tol=1e-12, rel_tol=1e-09)
this = new()
.........
return this
end
end
我看大家都這麼寫
### test/runtests.jl
using <套件名稱>
using Base.Test
tests = ["stable", # 測試檔名稱,我看大家都會取跟src裡的檔案名稱一樣
"cooling",
......
]
println("Running tests:")
for t in tests
println(" * $(t)")
include("$(t).jl")
end
寫某個功能的測試
### test/stable.jl
counter = StabilityCounter()
@test counter.update(1e-10) == 0
@test counter.update(1e-13) == 1
@test counter.update(1e-13) == 2
@test counter.update(1e-10) == 0
for i=1:149
counter.update(1e-13)
end
@test counter.ishalt() == false
counter.update(1e-13)
@test counter.ishalt() == true
跑測試:
Pkg.test("<套件名稱>")
他跑完會自動告訴你哪裡錯了!天阿!好簡單!