Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.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,单元测试应该测试所有通过的条件以及所有失败的条件吗 例如,假设我有一个test小部件(无法激活dgetifstatescancelled) 假设有100种可能的状态 当State==Cancelled时,我是否可以只测试我无法激活我的小部件,或者我是否还必须测试我是否可以在其他99个状态中激活它 是否有一些折衷办法可以让我避免把所有的时间都花在写测试上?:) 这是一个您希望使用一个参数化测试的场景,该测试获取所有99个值作为输入 使用xUnit.net时,可能会出现如下情况(未经测试,可能包含小

单元测试应该测试所有通过的条件以及所有失败的条件吗

例如,假设我有一个test
小部件(无法激活dgetifstatescancelled
)

假设有100种可能的状态

当State==Cancelled时,我是否可以只测试我无法激活我的小部件,或者我是否还必须测试我是否可以在其他99个状态中激活它


是否有一些折衷办法可以让我避免把所有的时间都花在写测试上?:)

这是一个您希望使用一个参数化测试的场景,该测试获取所有99个值作为输入

使用xUnit.net时,可能会出现如下情况(未经测试,可能包含小的编译错误):

[事实]
public void Widget_无法激活WidgetifStateIsCancelled()
{
//安排。。。
sut.State=State.Cancelled;
Assert.False(sut.CanActivate);
}
[理论,有效数据]
公共无效小部件\u可激活WidgetIfstateIsNotCancelled(状态)
{
//安排。。。
sut.State=状态;
Assert.True(sut.CanActivate);
}
私有类ValidStatesDataAttribute:DataAttribute
{
公共重写IEnumerable GetData(
MethodInfo methodUnderTest,类型[]参数类型)
{
返回Enum.GetValues(typeof(State))
.Cast()
.Exception(新[]{State.Cancelled})
.Select(x=>newobject[]{x});
}
}

这是一个场景,您希望使用一个参数化测试,将所有99个值作为输入

使用xUnit.net时,可能会出现如下情况(未经测试,可能包含小的编译错误):

[事实]
public void Widget_无法激活WidgetifStateIsCancelled()
{
//安排。。。
sut.State=State.Cancelled;
Assert.False(sut.CanActivate);
}
[理论,有效数据]
公共无效小部件\u可激活WidgetIfstateIsNotCancelled(状态)
{
//安排。。。
sut.State=状态;
Assert.True(sut.CanActivate);
}
私有类ValidStatesDataAttribute:DataAttribute
{
公共重写IEnumerable GetData(
MethodInfo methodUnderTest,类型[]参数类型)
{
返回Enum.GetValues(typeof(State))
.Cast()
.Exception(新[]{State.Cancelled})
.Select(x=>newobject[]{x});
}
}

如果你使用NUnit,你可以使用它,这样你只需要编写一个测试,但可以测试所有100个值。

如果你使用NUnit,你可以使用它,那么你只需要编写一个测试,但可以测试所有100个值。

你似乎在问你的测试是否应该是详尽的:是否应该测试所有可能的状态。答案是响亮的否定,原因很简单,即使是简单的代码也可能有太多的状态。即使是小程序,其潜在状态也比测试的状态要多,即使你一直在使用自大爆炸以来的状态

您应该改为使用:标识状态组,这样组中的所有状态都可能有类似的行为,然后每个组有一个测试用例


如果您这样做,您可能会发现您只需要两个测试用例。

您似乎在问您的测试是否应该是详尽的:您是否应该测试所有可能的状态。答案是响亮的否定,原因很简单,即使是简单的代码也可能有太多的状态。即使是小程序,其潜在状态也比测试的状态要多,即使你一直在使用自大爆炸以来的状态

您应该改为使用:标识状态组,这样组中的所有状态都可能有类似的行为,然后每个组有一个测试用例


如果这样做,您可能会发现您只需要两个测试用例。

谢谢您的示例。这会为每个状态运行一次测试吗?在测试用例期间,我从模拟数据库中获取数据,这样可能会对性能造成影响。@BlackKnight:是的,它会在每个状态执行一次测试。谢谢您的示例。这会为每个状态运行一次测试吗?在测试用例期间,我从模拟数据库获取数据,这样可能会对性能造成影响。@BlackKnight:是的,它会在每个状态执行一次测试。
[Fact]
public void Widget_CannotActiveWidgetIfStateIsCancelled()
{
    // Arrange ...

    sut.State = State.Cancelled;

    Assert.False(sut.CanActivate);
}

[Theory, ValidStatesData]
public void Widget_CanActivateWidgetIfStateIsNotCancelled(State state)
{
    // Arrange ...

    sut.State = state;

    Assert.True(sut.CanActivate);
}

private class ValidStatesDataAttribute : DataAttribute
{
    public override IEnumerable<object[]> GetData(
        MethodInfo methodUnderTest, Type[] parameterTypes)
    {
        return Enum.GetValues(typeof(State))
                   .Cast<State>()
                   .Except(new [] { State.Cancelled })
                   .Select(x => new object[] { x });
    }
}