FsCheck。对象和模型之间的区别
FsCheck. Difference between the object and the model
我最近听说了基于模型的测试并搜索了可以遵循这种方法的工具。
结果我发现 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
是相同的。
更新:
声明模型具有与被测对象相同的属性但值只是硬编码是否正确?
模型通常是一个不可变的值,并且比被测系统 (SUT) 更简单。通常对于基于模型的测试,SUT 实际上是一个系统,即一组相互关联的 classes 做一些重要的事情,包含多个数据结构等,或者它是一个非常复杂的 class,例如class 实现特定数据结构,如 B 树或并发队列。因此,找到一些更简单的东西,而不是完全模拟 SUT 中发生的一切,或者以非常幼稚或低效的方式模拟,是非常简单的。
很难在入门示例中展示这种示例,因为您很快就会迷失在细节中。对于您提供的示例,您可以用 3 元组(名称、描述、isOnOrderList)表示您的 class 并从那里开始。然后操作将是 setName、setDescription、setIsOnOrderList。但是由于您的起始示例本身非常简单,因此在这种情况下要找到更简单的东西来测试实质性内容并不容易。
一个稍微更详细的例子可能会有帮助,这里的 FsCheck 源代码中有:https://github.com/fscheck/FsCheck/blob/master/src/FsCheck/Script.fsx#L22 在该代码中,您可以看到模型 class 比 SUT 短得多,并且由不可变记录类型表示。
我最近听说了基于模型的测试并搜索了可以遵循这种方法的工具。
结果我发现 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
是相同的。
更新:
声明模型具有与被测对象相同的属性但值只是硬编码是否正确?
模型通常是一个不可变的值,并且比被测系统 (SUT) 更简单。通常对于基于模型的测试,SUT 实际上是一个系统,即一组相互关联的 classes 做一些重要的事情,包含多个数据结构等,或者它是一个非常复杂的 class,例如class 实现特定数据结构,如 B 树或并发队列。因此,找到一些更简单的东西,而不是完全模拟 SUT 中发生的一切,或者以非常幼稚或低效的方式模拟,是非常简单的。
很难在入门示例中展示这种示例,因为您很快就会迷失在细节中。对于您提供的示例,您可以用 3 元组(名称、描述、isOnOrderList)表示您的 class 并从那里开始。然后操作将是 setName、setDescription、setIsOnOrderList。但是由于您的起始示例本身非常简单,因此在这种情况下要找到更简单的东西来测试实质性内容并不容易。
一个稍微更详细的例子可能会有帮助,这里的 FsCheck 源代码中有:https://github.com/fscheck/FsCheck/blob/master/src/FsCheck/Script.fsx#L22 在该代码中,您可以看到模型 class 比 SUT 短得多,并且由不可变记录类型表示。