2013-09-01 52 views
2

我想使用快速检查(首次),以测试验证TCP端口号功能:使用Haskell的快速​​检查,以测试TCP端口验证

validatePort :: Int -> Either String Int 
validatePort port = 
    if port > 0 && port <= 65535 
    then Right port 
    else Left "Port must be between 1 and 65535 inclusive" 

我写了任意的一个实例是这样的:

instance Arbitrary Int where 
    arbitrary = choose (1, 65535) 

但我不知道如何编写测试属性。

+0

你应该给一些无效的端口作为输入以检查else分支(签出:http://book.realworldhaskell.org/read/testing-and-quality-assurance.html) – jev

回答

1

作为一个起点,第一:import Test.QuickCheck它已经定义了一个int

任意实例

然后写一个属性:

prop_validate_port port = 
    if port > 0 && port <= 65535 
    then validatePort port == Right port 
    else validatePort port == Left "Port must be between 1 and 65535 inclusive" 

和运行测试:

>quickCheck prop_validate_port 
>+++ OK. passed 100 tests. 
+0

@jozefg: thx为得到清理parens – jev

+0

谢谢。我认为这有效。至少,我认为测试正在运行:-)。我正在使用Hspec并没有收到任何错误。顺便说一句,我正在和Hspec一起爆发并编写Haskell测试。 – Ralph

1

,正如附录jev的答案,您还可以使用定制的Gen s:

享受松散耦合的测试框架
validPorts :: Gen Int 
validPorts = choose (1, 65535) 

invalidPorts :: Gen Int 
invalidPorts = oneof [choose (minBound, 0), choose (65536, maxBound)] 

prop_validatePortValidatesValidPorts = 
    forAll validPorts (\port -> validatePort port == Right port) 

prop_validatePortDoesNotValidateInvalidPorts = 
    forAll invalidPorts (\port -> validatePort port == Left "...")