什么是Haskell在另一个目录中导入模块的语法?
我正在开始使用Haskell,并希望练习使用HUnit编写简单的函数TDD样式.不过,我无法弄清楚如何构建我的文件.HUnit附带的示例似乎是一个平面目录结构.
我想将我的测试和HUnit代码放在与实际代码不同的文件夹中.我很欣赏一个快速的示例导入语句和一个关于如何构建我的文件的建议.
如果重要的话,我现在正在使用GHCi和NotePad ++进行编码.
当我谷歌如何将单元测试与cabal文件集成时,我发现
如何使用cabal运行所有单元测试(例如,每次我进行"cabal build")?
我是Haskell的新手,我正在尝试构建一个受测试的程序.我决定使用HUnit和Cabal.
从我所看到的一个结构良好的项目看起来如下:
src/
AppName/
Appname.hs
testsuite/
tests/
AppName/
TestRunner.hs
AppName.cabal
Setup.hs
Run Code Online (Sandbox Code Playgroud)
对我来说神秘的部分是TestRunner.hs和AppName.cabal.
在testuite/tests目录和子目录下运行所有测试的testrunner会是什么样子?它如何与Cabal集成?
另外,如何将hackage依赖项放在AppName.cabal中并从命令行构建它们?
我很难找到一个完整的示例,从头开始构建一个带有测试和依赖项的应用程序.
谢谢
是否有任何对HUnit或QuickCheck的扩展,允许像Bamboo这样的持续集成系统对测试结果进行详细报告?
到目前为止,我最好的想法是简单地将测试作为构建脚本的一部分进行触发,并依靠测试以非零退出代码进行失败.这对于在测试失败时获得注意力是有效的,但是将构建失败与测试失败混淆并且需要涉及通过控制台输出来确定问题的来源.
如果这是使用当前工具的最佳选择,我的想法是为HUnit编写一个报告模块,它将以JUnit XML格式生成输出,然后将CI工具指向它,就像报告Java项目一样.尽管如此,这看起来有些过时,所以我很感激您对现有选项和新开发方向的看法.
如果我有test/Test.hs
带
module Main where
import Test.HUnit
test1 :: Test
test1 = TestCase $ assertEqual "Should be one" 1 5
test2 :: Test
test2 = TestCase $ assertEqual "Shold both be zero" 0 0
main :: IO Counts
main = runTestTT $ TestList [test1, test2, test1]
Run Code Online (Sandbox Code Playgroud)
和.cabal
用
test-suite my-test
type: exitcode-stdio-1.0
hs-source-dirs: test
main-is: Test.hs
build-depends: base >= 4.8.1.0 && <4.9,
HUnit >= 1.3
default-language: Haskell2010
Run Code Online (Sandbox Code Playgroud)
我跑了cabal test --show-details='always'
然后我得到了
Test suite my-test: RUNNING...
### Failure …
Run Code Online (Sandbox Code Playgroud) 我希望能够确保函数在接收到无效值时会抛出错误.例如,假设我有一个只返回正数的函数pos:
pos :: Int -> Int
pos x
| x >= 0 = x
| otherwise = error "Invalid Input"
Run Code Online (Sandbox Code Playgroud)
这是一个简单的例子,但我希望你能得到这个想法.
我希望能够编写一个期望出现错误的测试用例并将其视为通过测试.例如:
tests = [pos 1 == 1, assertError pos (-1), pos 2 == 2, assertError pos (-2)]
runTests = all (== True) tests
Run Code Online (Sandbox Code Playgroud)
[我的解决方案]
这是我最终根据@ hammar的评论进行的.
instance Eq ErrorCall where
x == y = (show x) == (show y)
assertException :: (Exception e, Eq e) => e -> IO a -> IO ()
assertException ex action =
handleJust isWanted …
Run Code Online (Sandbox Code Playgroud) 我有一大堆的功能,如:method1
,method2
,method3
.对于所有的人也有HUnit
类似的测试功能:testMethod1
,testMethod2
,testMethod3
.
testMethod1 = TestCase $
assertEqual "testmethod1" ...
testMethod2 = TestCase $
assertEqual "testmethod2" ...
testMethod3 = TestCase $
assertEqual "testmethod3" ...
Run Code Online (Sandbox Code Playgroud)
我想避免将函数名称的冗余复制作为错误消息的前缀,并将其称为:
testMethod1 = TestCase $
assertEqual_ ...
Run Code Online (Sandbox Code Playgroud)
如何实现(任何"魔术"技巧都被欣赏)?
所以实际上问题是如何在其定义中采用函数名称?
更新.
从原始问题实际上并不清楚,我也想处理这种情况:
tProcess = TestCase $ do
assertEqual "tProcess" testResult $ someTest
assertEqual "tProcess" anotherTestResult $ anotherTest
assertEqual "tProcess" resultAgain $ testAgain
Run Code Online (Sandbox Code Playgroud)
最后我想写一些类似的东西:
tProcess = TestCase $ do
assertEqual_ testResult $ someTest
assertEqual_ anotherTestResult …
Run Code Online (Sandbox Code Playgroud) 我目前有以下测试代码:
testUpdate :: Test
testUpdate = testCase "update does change artist" $ do
(created, Just revised, parents) <- mbTest $ do
Just editor <- fmap entityRef <$> findEditorByName "acid2"
created <- create editor startWith
let artistId = coreMbid created
newRev <- update editor (coreRevision created) expected
editId <- openEdit
includeRevision editId newRev
apply editId
found <- findLatest artistId
parents <- revisionParents newRev
return (created, found, parents)
coreData revised @?= expected
assertBool "The old revision is a direct parent of the …
Run Code Online (Sandbox Code Playgroud) 我最近一直在尝试使用带有堆栈的travis CI,并且我已经遇到了一些问题.
我的.travis.yml文件位于我的仓库中:(我在堆栈网站上使用了指南)我的配置文件的快照如下:
sudo: false
# Caching so the next build will be fast too.
cache:
directories:
- $HOME/.stack
before_install:
# Download and unpack the stack executable
- mkdir -p ~/.local/bin
- export PATH=$HOME/.local/bin:$PATH
- travis_retry curl -L https://www.stackage.org/stack/linux-x86_64 | tar xz --wildcards --strip-components=1 -C ~/.local/bin '*/stack'
Run Code Online (Sandbox Code Playgroud)
当我将它们推送到git时,测试无法运行,travis CI尝试构建我的repo,但是当我检查日志时它说它无法找到堆栈命令.
但是在我的配置文件中,我指定它来安装堆栈.
我不确定为什么会这样,任何帮助将不胜感激?
haskell ×10
hunit ×10
cabal ×3
unit-testing ×3
quickcheck ×2
hackage ×1
test-runner ×1
testing ×1
travis-ci ×1