Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing 单元测试方法中相当复杂的条件的最佳实践是什么?_Unit Testing - Fatal编程技术网

Unit testing 单元测试方法中相当复杂的条件的最佳实践是什么?

Unit testing 单元测试方法中相当复杂的条件的最佳实践是什么?,unit-testing,Unit Testing,我有一个从公共setter调用的方法: private void EmitEvents(IGridCell[] oldGridCells) { bool wasAllInOneGridCell = _isAllInOneGridCell; _isAllInOneGridCell = GridCells[0] == GridCells[1] && GridCells[2] == GridCells[3] &

我有一个从公共setter调用的方法:

private void EmitEvents(IGridCell[] oldGridCells)
{
    bool wasAllInOneGridCell = _isAllInOneGridCell;

    _isAllInOneGridCell = GridCells[0] == GridCells[1] &&
                          GridCells[2] == GridCells[3] &&
                          GridCells[0] == GridCells[2];

    // All points were in the same grid cell before, and still are
    if (_isAllInOneGridCell && wasAllInOneGridCell && oldGridCells[0] == GridCells[0])
    {
        return;
    }

    for (int i = 0; i < 4; i++)
    {
        GridCellExited(this, new GridCellChangeEventArgs(oldGridCells[i]));
    }

    for (int i = 0; i < 4; i++)
    {
        GridCellEntered(this, new GridCellChangeEventArgs(GridCells[i]));
    }
}
private void EmitEvents(IGridCell[]oldGridCells)
{
bool wasAllInOneGridCell=_isalinonegridcell;
_IsAllineGridCell=GridCells[0]==GridCells[1]&&
GridCells[2]==GridCells[3]&&
GridCells[0]==GridCells[2];
//所有点以前都在同一网格单元中,现在仍然是
if(_isAllineGridCell&&wasAllInOneGridCell&&oldGridCells[0]==GridCells[0])
{
返回;
}
对于(int i=0;i<4;i++)
{
GridCellExited(这是新的GridCellChangeEventArgs(oldGridCells[i]);
}
对于(int i=0;i<4;i++)
{
GridCellEntered(这是新的GridCellChangeEventArgs(GridCells[i]));
}
}
这段代码到底做什么并不重要。我已经对这两个项目进行了测试。我想知道的是,当测试半复杂条件时,通常应该采取什么方法,比如在这个方法中的
if
语句

因为有3个布尔比较,所以总共有8个不同的组合。当然,我不想写8个单元测试来涵盖所有这些可能性。那我该怎么办呢?我想至少检查一个肯定条件和一个否定条件,但是创建类必须遵守的某种“规范”的单元测试的工作不是一部分吗

假设我在单元测试中选择的否定情况是,
\u isAllInOneGridCell
将等于false。然后假设有人正在进行重构,并且意外地从
if
语句中删除了
&&wasAllInOneGridCell
条件。他们引入了一个bug,但是由于我没有编写一个测试来涵盖这个非常普通的情况,所以它不会导致测试失败


总而言之,一方面,我将单元测试视为定义契约的一种方式,为了防止回归,代码必须遵循契约。不幸的是,为了坚持这一点,我不得不做一些疯狂的事情,比如对一行
if
语句进行正确的8个单元测试。这里的最佳路线是什么?

如果有8种可能的输入-输出方案(由您的条件决定),那么您对此无能为力;你要么全部测试,要么不测试。正如您所提到的,这是单元测试的一个方面——确保契约和防止回归

然而,如果您发现测试类很困难,那么重构可能会有所帮助。首先想到的是将复杂逻辑移动到单独的类(方法)。您可能仍然需要对逻辑进行多个测试,但这样做会将它与
EmitEvents
方法分离,该方法最终只会在两种情况下进行实际事件验证测试(逻辑通过-提升;逻辑失败-不)


在那种情况下,这总是一种判断。你们的逻辑是否足够复杂,足以使它独立存在,或者它仍然是它所在的类的一部分?不管怎样,如果你想全面测试你的合同,恐怕没有捷径可走。

我认为将许多测试用例合并到一个测试中是公平的,如果这能让测试变得更容易的话。 只要您不给测试增加太多的复杂性,并且在测试本身中引入错误的风险:-)

在某些情况下,在循环等中生成输入组合以覆盖所有组合是有意义的,而不是手工编码所有内容。。。 我同意,但要决定需要什么样的案例,总是需要做出判断