iT邦幫忙

2017 iT 邦幫忙鐵人賽
DAY 28
0
自我挑戰組

Julia語言—從入門到專案系列 第 28

[Day 28] Simulated annealing -- 包成套件並測試

前天終於摸懂julia要怎麼包成套件的形式並且做測試orz...............

他包成套件之後真的很好測試!!

創造套件

打開julia console,他本身就有內建套件管理程式Pkg,如果要開發套件的話請先安裝PkgDev

Pkg.add("PkgDev")

這會自動從網路上下載並且安裝PkgDev套件,然後使用套件的話:

using PkgDev

接著,如果要創造一個叫作FooBar的套件的話:

PkgDev.generate("FooBar", "MIT")

第一個參數是你的套件名稱,後面的那個是你的opensource license。
julia會自動在你的<家目錄>/.julia/<版本>/下創一個FooBar的資料夾,資料夾結構如下:

http://ithelp.ithome.com.tw/upload/images/20170103/20103529ddQnzYFWeS.png

我是在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("<套件名稱>")

他跑完會自動告訴你哪裡錯了!天阿!好簡單!


上一篇
[Day 20] 整理Reactive programming
下一篇
[Day 29] Simulated annealing -- 公開程式碼
系列文
Julia語言—從入門到專案31

尚未有邦友留言

立即登入留言