2013-08-28 31 views
2

是否有一個簡單的工作流程來編寫將對象存儲爲.rds或.rda的測試,以便將來的測試運行可以比較代碼執行結果與存儲對象的結果?這樣可以很容易地檢查返回有些複雜值的函數是否仍然像他們應該那樣工作。對存儲的R對象進行測試

例如,像:

test_obj(res <- lm(y ~ x, data.frame(x=1:3, y=5:7))) 

,如果*擴展數據/ test_obj.res.rds *不存在,將在*安裝/擴展數據/ test_obj.res.rds創建*與res從上面,但如果它確實存在,將與rds中恢復的那個相同/ all.equal等新生成的對象。我會發現這樣的測試超級有用,我有點驚訝,RUnit/svUnit/testthat沒有實現這種類型的東西(我希望他們這樣做,我只是沒有找到它)。

testthat::make_expectation已關閉,但我寧願有一個自動存儲/檢索rds而不是將文本表示粘貼到文件中,我認爲這是您應該如何使用testthat::make_expectation(我想我可以管stdout()轉換爲.R文件,但即使如此,仍有一些自動化可以促進該過程)。

+0

這是(關閉)拉請求,https://github.com/hadley/testthat/pull/38/files,你在找什麼? – hadley

+0

是的,大致。你認爲它超出了測試範圍? – BrodieG

+0

很多移動的部分,而不是顯而易見的緩存策略應該如何工作。 – hadley

回答

5

它只花了我三年,但我寫了unitizer來解決這個問題。它是一個具有交互式UI的單元測試框架,允許您查看測試輸出並將其存儲/拒絕,只需一次按鍵。它還簡化了更新/測試/調試周期,方法是向您顯示錯誤測試的適當區別,然後將您放到這些測試評估環境中,以便在交互式用戶界面中進行調試。

例如,如果我們有一個matrix rotation function(禮貌@MatthewLundberg)我們要測試:

# mx-rotate.R 

rotate <- function(x) t(apply(x, 2, rev)) 

而且腳本與一些測試:

# mx-test.R 

mx <- matrix(1:9, 3) 
rotate(mx) 
rotate(rotate(mx)) 
rotate(rotate(rotate(mx))) 

然後:

library(unitizer) 
unitize('mx-test.R') 

將啓動一個交互式會話,這將允許您查看三個ro的結果如果他們按預期工作,則呼叫並接受他們作爲測試。

有一個screencast演示可用。

+1

你能以某種方式包含一個例子嗎? –

+0

@MatthewLundberg,完成。可能最好的辦法是看screencast或者demo('unitizer',package ='unitizer')'。另外,你最高的質量保證幾乎是我的屏幕錄像的劇本,或者你是否先看過屏幕視頻然後來到這裏(我剛纔看到你的配置文件之前我沒有看到你的答案),這是一個驚人的巧合。 – BrodieG

+0

完全的巧合,我向你保證,而且確實是一個很好的巧合。 –

2

截至2017年,testthat的功能expect_equal_to_reference,這正是問題的要求。我想哈德利W.想出了一個辦法。

+0

是的。我一直在使用它。我忘記了這個問題。我也即將發佈[unitizer](https://github.com/brodieG/unitizer),它以更全面的方式做到這一點。 – BrodieG