如何通过测试证明这种短路?

时间:2017-08-01 21:58:09

标签: c#

考虑以下表达式:

if(!(A || B))

我不确定这是否会以与

相同的方式短路
if(!A && !B)
是的吗?

如果是这样,我将如何编写测试来自行验证?

3 个答案:

答案 0 :(得分:3)

编写一个测试,其中AB是返回布尔值并具有某种副作用的方法(例如设置属性)。然后,您的测试可以检查A设置属性,而B没有。如果你不想进行正式的测试测试,你可以使用像.NET Fiddle这样的东西。

以下是您尝试做的简化示例。

https://dotnetfiddle.net/jS58eJ

答案 1 :(得分:1)

此上下文中的“短路”仅表示您在BA时未评估true。一种简单的测试方法是将B作为方法,只要评估为A,就可以true制作B,然后查看B方法是否被调用。您可以通过在调试器中运行代码并设置断点,或在B中设置标志,或者将其设置为控制台程序并调用Console.WriteLine("B method called")来观察对B的调用A或......

我希望这足以让你明白这一点。

并且,为了记录,这两个表达式应该以完全相同的方式短路。即当trueB时,{{1}}不会被评估。

答案 2 :(得分:0)

当谈到逻辑和一些变量时,我喜欢使用真值表。

所以要做到这一点你会:

enter image description here

如果您要进行单元测试断言,可以使用A和B的四种组合并测试两种情况是否相等。

要在C#和Visual Studio中使用单元测试,请右键单击要测试的方法,然后选择"创建单元测试"像这样:

enter image description here

这将为单元测试创​​建一个额外的项目。

在这种情况下,方法 IsEquivalent(a,b)会返回 true false ,具体取决于相关语句是否相同。< / p>

因此,查看我们的单元测试代码,您可以像这样填写测试方法:

[TestMethod()]
    public void IsEquivalentTest()
    {
        Assert.IsTrue(Program.IsEquivalent(false, false));
        Assert.IsTrue(Program.IsEquivalent(false, true));
        Assert.IsTrue(Program.IsEquivalent(true, false));
        Assert.IsTrue(Program.IsEquivalent(true, true));
    }

如果等效性测试方法为 A B的每个输入组合返回 true ,则此测试方法断言

如果确实如此,那么我们知道这些陈述是等价的!

要运行测试,请右键单击并选择&#34;运行测试&#34;。 这应该打开Test Explorer,它应该表明所有的断言都已通过了!

enter image description here

这与真相表一致。