当我 运行 所有测试时单元测试失败但当我调试时通过
Unit Tests failing when I Run All Tests but pass when I Debug
我在 Visual Studio 2017 年使用 NUnit3 并进行 TDD。自从我更新了我的代码以使我的最新测试通过后,发生了一些非常奇怪的事情。
现在,当我单击 运行 所有测试时,我的其他 3 个测试都失败了,如下所示:
它告诉我我的 Assert 方法中的实际值和预期值不相等。
但是,当我在Assert方法所在的行下断点并开始调试时,堆栈跟踪显示预期和实际是相同的值,然后测试通过,如下所示:
我是不是在做一些愚蠢的事情,或者 VS2017 或 NUnit 中是否存在错误?
其他人遇到过这种情况吗?
[编辑:我应该补充一点,我已经将每个测试写成单独的 class]
可能会出现一些细微的差异。例如,如果第一个测试改变了一个影响第二个测试行为的状态,那么如果我 运行 单独进行,那么第二个测试的结果可能会不一样。
在无法使用断点时帮助理解测试失败的想法可能是添加日志记录。
总之,回答你的问题:
This ever happen to anyone else?
是
Am I doing something stupid or could there be a bug in VS2017 or NUnit or something?
我敢打赌两者都不是:只是一个更微妙的案例
失败的测试共享一个资源,当一起测试时会影响它们。重新检查受影响的测试及其主题。
您还应该查看主题中的 static 字段或属性。如果在设计 类.
时使用不当,它们往往会导致问题
我在 Visual Studio 2017 年使用 MSTest 作为测试框架时遇到了类似的问题。当测试 运行 时,单元测试中的断言失败,但在调试单元测试时会通过。这发生在少数单元测试中,但不是全部。除了断言失败之外,许多单元测试也因 System.TypeLoadException (Could not load type from assembly error) 而失败。我最终做了以下解决问题的方法:
- 打开解决方案中的Local.testsettings文件
- 转到 "Unit Test" 设置
- 取消选中 "Use the Load Context for assemblies in the test directory." 复选框
采取这些步骤后,所有单元测试在 运行 时开始通过。
我自己也遇到过这种现象,但是很容易就找到了原因。更具体地说,我测试了一些矩阵计算,在我的测试 class 中,我将要计算的数据定义为 class 变量,并用它执行了我的计算。然而,我的矩阵例程修改了原始数据,所以当我在测试 class 上使用 "run tests" 时,第一次测试破坏了数据,下一次测试无法成功。
下面的示例代码试图说明我的意思。
[TestFixture]
public void MyTestClass()
{
[Test]
public void TestMethod1()
{
MyMatrix m = new MyMatrix();
// Method1() modifies the data...
m.Method1(_data);
}
[Test]
public void TestMethod2()
{
MyMatrix m = new MyMatrix();
// here you test with modified data and, in general, cannot expect success
m.Method2(_data);
}
// the data to test with
private double[] _data = new double[1, 2, 3, 4]{};
}
我在 Visual Studio 2017 年使用 NUnit3 并进行 TDD。自从我更新了我的代码以使我的最新测试通过后,发生了一些非常奇怪的事情。
现在,当我单击 运行 所有测试时,我的其他 3 个测试都失败了,如下所示:
它告诉我我的 Assert 方法中的实际值和预期值不相等。
但是,当我在Assert方法所在的行下断点并开始调试时,堆栈跟踪显示预期和实际是相同的值,然后测试通过,如下所示:
我是不是在做一些愚蠢的事情,或者 VS2017 或 NUnit 中是否存在错误?
其他人遇到过这种情况吗?
[编辑:我应该补充一点,我已经将每个测试写成单独的 class]
可能会出现一些细微的差异。例如,如果第一个测试改变了一个影响第二个测试行为的状态,那么如果我 运行 单独进行,那么第二个测试的结果可能会不一样。
在无法使用断点时帮助理解测试失败的想法可能是添加日志记录。
总之,回答你的问题:
This ever happen to anyone else?
是
Am I doing something stupid or could there be a bug in VS2017 or NUnit or something?
我敢打赌两者都不是:只是一个更微妙的案例
失败的测试共享一个资源,当一起测试时会影响它们。重新检查受影响的测试及其主题。
您还应该查看主题中的 static 字段或属性。如果在设计 类.
时使用不当,它们往往会导致问题我在 Visual Studio 2017 年使用 MSTest 作为测试框架时遇到了类似的问题。当测试 运行 时,单元测试中的断言失败,但在调试单元测试时会通过。这发生在少数单元测试中,但不是全部。除了断言失败之外,许多单元测试也因 System.TypeLoadException (Could not load type from assembly error) 而失败。我最终做了以下解决问题的方法:
- 打开解决方案中的Local.testsettings文件
- 转到 "Unit Test" 设置
- 取消选中 "Use the Load Context for assemblies in the test directory." 复选框
采取这些步骤后,所有单元测试在 运行 时开始通过。
我自己也遇到过这种现象,但是很容易就找到了原因。更具体地说,我测试了一些矩阵计算,在我的测试 class 中,我将要计算的数据定义为 class 变量,并用它执行了我的计算。然而,我的矩阵例程修改了原始数据,所以当我在测试 class 上使用 "run tests" 时,第一次测试破坏了数据,下一次测试无法成功。
下面的示例代码试图说明我的意思。
[TestFixture]
public void MyTestClass()
{
[Test]
public void TestMethod1()
{
MyMatrix m = new MyMatrix();
// Method1() modifies the data...
m.Method1(_data);
}
[Test]
public void TestMethod2()
{
MyMatrix m = new MyMatrix();
// here you test with modified data and, in general, cannot expect success
m.Method2(_data);
}
// the data to test with
private double[] _data = new double[1, 2, 3, 4]{};
}