1

我最近听说了基于模型的测试,并搜索了可以遵循这种方法的工具。

结果我找到了 FsCheck

实验页面,作者描述了如何创建一个可以执行的基于模型的测试。

这一切都很好,但遗憾的是我不明白实际对象和对象模型之间有什么区别。

因此,给定以下代码:

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是相同的。

升级版:

声明模型具有与被测对象相同的属性,但这些值只是硬编码的,这是否正确?

4

1 回答 1

0

该模型通常是一个不可变的值,并且比被测系统 (SUT) 更简单。通常对于基于模型的测试,SUT 实际上是一个系统,即一组相互关联的类,它们做一些不平凡的事情,包含多个数据结构等,或者它是一个非常复杂的类,例如实现特定数据结构的类,像 B 树或并发队列。因此,找到一些更简单的东西,它不能完全模拟 SUT 中发生的所有事情,或者以非常幼稚或低效的方式这样做,是非常简单的。

很难在入门示例中展示这种示例,因为您很快就会迷失在细节中。对于您提供的示例,您可以用 3 元组(名称、描述、isOnOrderList)表示您的类,然后从那里开始。然后操作将是 setName、setDescription、setIsOnOrderList。但是由于您的起始示例本身非常简单,因此在这种情况下要找到更简单的东西来测试一些实质性的东西并不容易。

一个稍微复杂一点的例子可能会有所帮助,这里的 FsCheck 源代码中有:https ://github.com/fscheck/FsCheck/blob/master/src/FsCheck/Script.fsx#L22在该代码中,您可以看到模型类比 SUT 短得多,并且由不可变的记录类型表示。

于 2018-05-24T19:54:58.360 回答