当一起运行时单元测试失败,但单独运行时通过。

3

我在进行单元测试时遇到了一些问题,无法将它们复制并粘贴在这里,但我会提供我能提供的内容。

问题似乎是,如果我逐个运行测试,一切都按预期工作,但如果我告诉它同时运行所有测试,则只有五分之一的测试通过。

[TestMethod]

    public void ObjTest()
    {
        //Arrange - multiple ecus and items 
        var t = new var();
        t.itemNumbers = new List<ItemNumber>();

        obj e = new obj();
        e.property = "(12345 OR 55555) AND !65232";

        Globals.masterList.Add(e);

        ItemNumber i = new ItemNumber();
        i.num= "12345";

        ItemNumber i1 = new ItemNumber();
        i1.num= "55555";

        ItemNumber i2 = new ItemNumber();
        i2.num= "55556";
        t.itemNumbers.Add(i);
        t.itemNumbers.Add(i1); 
        t.itemNumbers.Add(i2);

        ICollection<Iinterface> tmp = new List<Iinterface>();

        //act, process the ecu and item lists
        ;
        functionCalled(t.itemNumbers, Globals.masterList, ref tmp);

        //assert, there should be only 2 added to the list
        Assert.AreEqual(1, tmp.Count, " ");
        Assert.AreEqual("(12345 OR 55555) AND !65232", functionCalled(t.itemNumbers, Globals.masterList, ref tmp), "Wrong obj returned.");

    }

所有单元测试基本上都是复制并粘贴,只需更改 e.property 和可能更改其中一个 i 数字,
这些测试旨在检查由用户输入引起的边界情况。
是否有什么我错过的东西可以确保作用域清除所有变量和测试之间的所有内容,或者强制串行执行?

4
我的猜测是,Globals.masterList.Add(e); 是你的问题所在——测试中有一个全局元素意味着它们不是相互独立的。这很可疑。 - dav_i
2
如果这与 Globals.masterList.Add(e) 没有关系,我会舔我的小脚趾。 - Jeroen Vannevel
正如@dav_i所建议的那样,您可能受到静态成员在列表之间共享的影响。然后线程添加i、i1和i2,您对它们存在的断言变得不可靠。 - faester
9
我强烈建议不要将类型命名为“var”。这只会混淆人们的思维... - Jon Skeet
1
没有问题,但是 -var t = new var();- ... - Benji_9989
显示剩余5条评论
1个回答

1
我建议考虑 Globals.masterList.Add(e); 假设您的单元测试在五个线程中执行。这意味着Globals.masterList.Add(e);将被执行五次,或者masterList将由五个不同的线程修改。 然后您有下一行代码:
Assert.AreEqual("(12345 OR 55555) AND !65232", functionCalled(t.itemNumbers, Globals.masterList, ref tmp), "Wrong obj returned.");

functionCalled 处理被其他函数修改过的列表,结果导致输出不同,从而导致单元测试失败。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接