0

好的,所以我设置了多个测试用例,然后最后将它们组合在一起。 忘记放一些代码,所以我添加了它

问题是,例如,当我输入Main>tests 1 时,会显示正确答案,但是如果我尝试单独运行测试用例,例如main>test0 ,我的输出将变为“TestCase _”

main>Alltests我的输出是“ TestList [TestLabel test1 TestCase _,TestLabel test0 TestCase _,TestLabel test7 TestCase _,TestLabel est51 TestCase _]”

我的问题是是什么导致了 _ 以及为什么它不能识别测试用例

assertException :: (Exception e, Eq e) => e -> IO a -> IO ()
assertException ex action =
      handleJust isWanted (const $ return ()) $ do
            action
            assertFailure $ "Expected exception: " ++ show ex
     where isWanted = guard . (== ex) 

assertError ex f = 
      assertException (ErrorCall ex) $ evaluate f



tests :: Integer -> [Integer]

tests n | n == 0              = error "Not positive"
        | n == 1              = [1]
        | (n `div` 2 == 0)    = n:tests(n*2)
        | otherwise           = n:tests(3*n) 



test0 = 
      TestCase ( assertError
                    "tests 0" 
                     ( tests 0 )
               )


test7 = 
      TestCase ( assertEqual
                    "tests 7" 
                [7,18,9]
                     ( tests 7 )
                )

test51 = 
      TestCase ( assertEqual
                    [9,8,9]
                    "tests 51"

                  ( tests 51 )
               )



alltests = 
     TestList [
             -- TestLabel "test1" test1
               TestLabel "test0" test0
             , TestLabel "test7" test7
             , TestLabel "test51"test51
             ]
4

2 回答 2

6

当您在提示符处键入test0allTests(注意:不能以大写字母开头,因为它不是构造函数)时,您实际上并没有运行测试。test0也是一个类型的TestallTests。因此,当您在 ghci 提示符下键入其中任何一个时,该值将转换为Stringvia showString然后将其打印出来。

for的Show实例Test无法将包含Assertion的 s 转换为有意义的String,因为 anAssertionIO-action。因此,它通常在此处显示一个下划线以指示“这是一个断言”。

tests 1

另一方面是 type 的表达式tests 1 :: Integral a => [a],当您在提示符下键入这样的表达式时,它也被转换为Stringvia (在默认为show修复类型变量之后),但这里的实例需要完全评估列表.aIntegerShow

要实际运行您的测试,您需要runTestTTperformTest(或来自 HUnit 的其他测试运行器之一)。

于 2012-12-03T14:39:24.590 回答
1

首先我不得不说你的代码是一团糟。你确实写过复制破坏了你的格式,但是,如果你真的想要一个写得很好的解决你的问题的方法,最好也写一个写得好的问题。然而,实际运行您的代码需要进行一些更改。

例如:在您的定义中test0,您使用了一个assertError不存在的名为的函数,所以我假设您的意思assertEqual是在您的其他测试用例中。您的测试用例的另一个问题是函数的使用assertEqual :: (Eq a, Show a) => String -> a -> a -> Assertion:它需要三个参数,但在您的定义中它只有两个。后两个参数代表预期值和实际值,我猜,您忘记了实际值。所以我不知道,你想测试什么。

编辑:但我猜你的函数和相应测试的问题是,你的函数构造了一个无限列表(除了01作为输入值之外n),所以你的函数不会像测试用例一样终止。(我首先以为这也是输出神秘的原因,但这似乎是错误的。)

于 2012-12-03T14:39:12.950 回答