我最近听说过基于模型的测试,并搜索了可以遵循这种方法的工具。
结果我发现FsCheck。
在Experimental页面,作者描述了如何创建可以执行的基于模型的测试。
这一切都很好,但遗憾的是我不明白实际物体和物体模型之间会有什么区别。
所以,给出以下代码:
using System;
using System.Collections.Generic;
using System.Text;
namespace SimpleOrderApp
{
public class Order
{
private string _name;
private string _description;
private bool _isOnOrderList;
public Order(string name, string description)
{
_name = name;
_description = description;
_isOnOrderList = false;
}
public string Name {
get => _name;
set
{
if (!_isOnOrderList)
{
return;
}
_name = value;
}
}
public string Description
{
get => _description;
set
{
if (!_isOnOrderList)
{
return;
}
_description = value;
}
}
public bool IsOnOrderList
{
get => _isOnOrderList;
set => _isOnOrderList = value;
}
}
}
规格: - 用户可以提供订单名称 - 用户可以提供订单说明 - 如果订单在OrderList中(IsOnOrderList = true),则用户无法更新订单
错误:
代码
if (!_isOnOrderList)
{
return;
}
不应该有!
。
有人可以帮我构建一个OrderModel
,我可以用它来验证我的Order
对象并向我解释为什么要这样做?目前,我非常希望Order
和OrderModel
相同。
UPD:
说明模型具有相同的被测对象属性是否正确,但这些值只是硬编码?
答案 0 :(得分:0)
模型通常是不可变的值,比被测系统(SUT)简单。通常,对于基于模型的测试,SUT实际上是一个系统,即一组相互关联的类,它们做一些非平凡的事情,包含多个数据结构等,或者它是一个相当复杂的类,例如,实现特定数据结构的类,如B树或并发队列。因此,找到一些更简单的东西,不能完全模拟SUT中发生的一切,或者以一种非常幼稚或无效的方式进行建模,这是非常简单的。
很难在入门示例中显示这种示例,因为您很快就会迷失在细节中。对于您给出的示例,您可以通过3元组(name,description,isOnOrderList)表示您的类,并从那里开始。然后操作将是setName,setDescription,setIsOnOrderList。但是,既然你的起始实例本身就是如此简单,那么在这种情况下找到更简单的东西来测试某些东西并不是直截了当的。
稍微复杂一点的例子可能会有所帮助,这里有FsCheck源代码:https://github.com/fscheck/FsCheck/blob/master/src/FsCheck/Script.fsx#L22在该代码中,您可以看到模型类比SUT短得多,并且由不可变记录表示类型。