标签: hunit

在子目录中导入模块的Haskell语法是什么?

什么是Haskell在另一个目录中导入模块的语法?

我正在开始使用Haskell,并希望练习使用HUnit编写简单的函数TDD样式.不过,我无法弄清楚如何构建我的文件.HUnit附带的示例似乎是一个平面目录结构.

我想将我的测试和HUnit代码放在与实际代码不同的文件夹中.我很欣赏一个快速的示例导入语句和一个关于如何构建我的文件的建议.

如果重要的话,我现在正在使用GHCi和NotePad ++进行编码.

haskell hunit

31
推荐指数
2
解决办法
1万
查看次数

集成单元测试的当前状态与Haskell的Cabal?

当我谷歌如何将单元测试与cabal文件集成时,我发现

如何使用cabal运行所有单元测试(例如,每次我进行"cabal build")?

haskell quickcheck cabal hunit

21
推荐指数
1
解决办法
2469
查看次数

如何使用HUnit和Cabal进行自动化测试?

我一直在与Cabal争夺一天的大部分时间,试图使其自动化测试功能与HUnit一起使用.我已经在这里这里阅读了文档,并且我的Test-Suite部分设置如同它所示,但每当我尝试使用cabal buildCabal 构建软件包时,我认为唯一支持的Test-Suite类型是exitcode-stdio-1.0.是什么赋予了?

haskell unit-testing cabal hunit

14
推荐指数
1
解决办法
3446
查看次数

使用测试创建完整的Haskell堆栈

我是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中并从命令行构建它们?

我很难找到一个完整的示例,从头开始构建一个带有测试和依赖项的应用程序.

谢谢

haskell cabal hackage test-runner hunit

12
推荐指数
1
解决办法
2910
查看次数

具有持续集成的HUnit/QuickCheck

是否有任何对HUnit或QuickCheck的扩展,允许像Bamboo这样的持续集成系统对测试结果进行详细报告?

到目前为止,我最好的想法是简单地将测试作为构建脚本的一部分进行触发,并依靠测试以非零退出代码进行失败.这对于在测试失败时获得注意力是有效的,但是将构建失败与测试失败混淆并且需要涉及通过控制台输出来确定问题的来源.

如果这是使用当前工具的最佳选择,我的想法是为HUnit编写一个报告模块,它将以JUnit XML格式生成输出,然后将CI工具指向它,就像报告Java项目一样.尽管如此,这看起来有些过时,所以我很感激您对现有选项和新开发方向的看法.

continuous-integration haskell quickcheck hunit

11
推荐指数
1
解决办法
1097
查看次数

当我的测试失败时,为什么我的HUnit测试套件会通过?

如果我有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)

haskell unit-testing hunit

10
推荐指数
1
解决办法
316
查看次数

如何在Haskell中测试错误?

我希望能够确保函数在接收到无效值时会抛出错误.例如,假设我有一个只返回正数的函数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)

testing error-handling haskell unit-testing hunit

8
推荐指数
1
解决办法
3185
查看次数

获取其中的函数名称

我有一大堆的功能,如: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)

haskell hunit template-haskell

7
推荐指数
1
解决办法
1296
查看次数

是否可以在IO以外的monad中使用带有测试框架的HUnit?

我目前有以下测试代码:

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)

haskell hunit

7
推荐指数
1
解决办法
388
查看次数

与Travis CI叠加

我最近一直在尝试使用带有堆栈的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,但是当我检查日志时它说它无法找到堆栈命令.

但是在我的配置文件中,我指定它来安装堆栈.

我不确定为什么会这样,任何帮助将不胜感激?

continuous-integration haskell hunit travis-ci

6
推荐指数
1
解决办法
307
查看次数