是否有任何流行的MBT 在Java中的框架?你们中的任何人都在使用MBT技术吗?
答案 0 :(得分:2)
接近基于模型的测试的一种方法是构建一个已知良好的实现并与之进行比较。这样做的最佳策略之一是使用更高级别的语言,以便简单易懂地阅读和推理简短的实现。
我使用Haskell和QuickCheck对查询评估进行基于模型的测试取得了巨大成功。我将查询语言表示为Haskell数据类型,然后简单地将其作为Arbitrary
的实例。完成后,QuickCheck可以生成无限数量的查询,然后我可以针对被测服务器和我的模型实现进行评估。
Scala和Scala-Check可能允许您在JVM上执行相同的操作。
作为如何使用它的一个简单示例,这是一个快速而肮脏的例子:
import Test.QuickCheck
import Control.Monad (liftM,liftM2)
-- An simple expression data type.
-- Expression is either (Add X Y, Minus X Y, Multiply X Y or just a plain value)
-- where X and Y are further expressions
data Expression = Add Expression Expression
| Minus Expression Expression
| Multiply Expression Expression
| Value Int
deriving Show
-- This is my model-based approach, high level
evaluate :: Expression -> Int
evaluate (Value x) = x
evaluate (Add lhs rhs) = evaluate lhs + evaluate rhs
evaluate (Minus lhs rhs) = evaluate lhs - evaluate rhs
evaluate (Multiply lhs rhs) = evaluate lhs * evaluate rhs
在此之后,我已经知道了一个简单模型的良好实现。只是通过检查代码,我可以合理地确定这是我认为应该做的。现在我可以使用Arbitrary
生成任意复杂的表达式。下面的权重表示频率(因此70%的生成表达式为Value
,10%为任意Add
语句等等。
instance Arbitrary Expression where
arbitrary = frequency [
(70,liftM Value arbitrary)
, (10,liftM2 Add arbitrary arbitrary)
, (10,liftM2 Minus arbitrary arbitrary)
, (10,liftM2 Multiply arbitrary arbitrary)
]
这个定义为QuickCheck提供了创建任意表达式的能力。例如:
> sample (arbitrary :: Gen Expression)
Multiply (Value 1) (Value 0)
Value 1
Add (Value (-3)) (Add (Value (-1)) (Minus (Value 3) (Value 0)))
Value (-4)
Value (-19)
Add (Value (-49)) (Value (-55))
Minus (Value 50) (Value 103)
Value 210
Value (-172)
Value (-907)
Value (-2703)
我认为这已经非常酷了(但也许我只是很奇怪)。真正有力的一点是,现在我可以指定一个保留所有生成值的不变量
prop_testAgainstModel :: Expression -> Bool
prop_testAgainstModel expr = evaluate expr == evaluate' expr
我们假设evaluate'
是我评估我想要根据我的模型验证的事情的超级复杂方式。然后,QuickCheck将生成许多任意表达式,并尝试反驳我的断言。
这是一个针对我尝试生成更复杂的评估函数的示例。
> quickCheck prop_testAgainstModel
*** Failed! Falsifiable (after 28 tests):
Multiply (Value (-53758)) (Value 125360)
我用这种方法测试用C ++编写的外部服务器。 Haskell模型实现可能只有几百行代码,我可以将它与Web服务的结果进行比较,而不是上面的代码。
答案 1 :(得分:2)