gpt4 book ai didi

unit-testing - 如何使用 Haskell Stack 项目运行多个测试文件

转载 作者:行者123 更新时间:2023-12-03 01:20:20 25 4
gpt4 key购买 nike

我想使用 Stack 设置现有的 Haskell 项目。现有项目使用test目录下的多个文件;默认情况下,这些单独的测试文件,Stack(或 cabal?)似乎利用单个 test/Spec.hs 进行测试。我怎样才能继续在这个项目中使用多个文件?

注意:我正在学习 Haskell,这个项目是通过“kata”方法来学习的。因此测试是孤立的,一次只关注语言的一个方面。

最佳答案

这是这样的目录结构的设置

> tree                                                                                       
.
├── example.cabal
├── app
│   └── Main.hs
├── ChangeLog.md
├── LICENSE
├── Setup.hs
├── src
│   ├── A
│   │   └── C.hs
│   ├── A.hs
│   └── B.hs
├── stack.yaml
└── tst
├── integration
│   └── Spec.hs
└── unit
├── A
│   └── CSpec.hs
├── ASpec.hs
├── BSpec.hs
└── Spec.hs

您希望进行与通常的单元测试分开的集成测试以及与 src 文件夹中的每个模块相对应的多个子模块

首先,您需要将测试套件添加到您的

example.cabal 文件

name:                example
...
-- copyright:
-- category:
build-type: Simple
extra-source-files: ChangeLog.md
cabal-version: >=1.10

executable testmain
main-is: Main.hs
hs-source-dirs: app
build-depends: base
, example

library
exposed-modules: A.C,A,B
-- other-modules:
-- other-extensions:
build-depends: base >=4.9 && <4.10
hs-source-dirs: src
default-language: Haskell2010

test-suite unit-tests
type: exitcode-stdio-1.0
main-is: Spec.hs
hs-source-dirs: tst/unit
build-depends: base
, example
, hspec
, hspec-discover
, ...

test-suite integration-tests
type: exitcode-stdio-1.0
main-is: Spec.hs
hs-source-dirs: tst/integration
build-depends: base
, example
, hspec
, ...

将以下内容放入您的tst/unit/Spec.hs中,它来自hspec-discover,它会发现(因此得名)形式为的所有模块>...Spec.hs 并执行每个模块中的 spec 函数。

tst/unit/Spec.hs

{-# OPTIONS_GHC -F -pgmF hspec-discover #-}

就这一行

其他测试文件

然后在 ASpec.hs 中添加单元测试,在 BSpec.hsCSpec.hs 中添加其他单元测试tst/integration 文件夹中的 Spec.hs

module ASpec where

import Test.Hspec
import A

spec :: Spec
spec = do
describe "Prelude.head" $ do
it "returns the first element of a list" $ do
head [23 ..] `shouldBe` (23 :: Int)

it "returns the first element of an *arbitrary* list" $
property $ \x xs -> head (x:xs) == (x :: Int)

it "throws an exception if used with an empty list" $ do
evaluate (head []) `shouldThrow` anyException

然后您可以使用以下命令编译并运行测试

$> stack test
# now all your tests are executed
$> stack test :unit-tests
# now only the unit tests run
$> stack test :integration-tests
# now only the integration tests run

来源

您可以在 https://hspec.github.io 找到所有示例,如果您想了解更多有关 hspec 式测试的信息,我想最好从那里开始。对于堆栈 - 转到 https://haskellstack.org - 那里有一些关于测试/基准测试的信息 - 我的意思是关于运行测试和基准测试。

对于 haskell 中的不同测试风格,请参阅 HUnit、QuickCheck、Smallcheck、doctests(如果我忘记了其中一个,我深表歉意 - 这些也是我经常使用的)。

关于unit-testing - 如何使用 Haskell Stack 项目运行多个测试文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43263965/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com