C#单元测试中跨TestMethod无法获取类实例变量更新值的问题咨询
问题描述
我是单元测试新手,正在尝试编写基础测试程序。我创建了一个包含私有变量storage的类,声明了add和temp两个方法:add方法用于更新storage的值,temp方法返回storage的值。但在单元测试中,不同的TestMethod里,调用add方法更新值后,另一个TestMethod调用temp方法仍返回初始值0,而非更新后的值,请问如何让第二个TestMethod获取到更新后的storage值?
相关代码如下:
被测试类代码:
// Class scope variable private int storage = 0; public int Storage { get { return storage; } set { storage = value; } } public void add(int pass) { Storage += pass; } public int temp (){ return Storage; }
测试类代码:
// Testing namespace TestProject1 { [TestClass] public class UnitTest1 { [TestMethod] public void Adding_Storage() { Class1 class1 = new Class1(); class1.add(5); int result = class1.temp(); // 原代码中testing应为class1,此处修正 Assert.AreEqual(5, result); } [TestMethod] public void Display_Storage() { Class1 class1 = new Class1(); int result = class1.temp(); Assert.AreEqual(0, result); // 期望此处返回5,但实际还是0 } } }
问题原因
每个[TestMethod]执行时,测试框架会创建一个全新的UnitTest1实例,而且你在每个测试方法里都单独new了Class1对象,所以两个测试方法操作的是完全独立的Class1实例,状态自然无法共享。
解决方案
方案1:使用静态成员共享被测试类实例
将Class1的实例声明为测试类的静态成员,并在所有测试执行前初始化一次,这样所有测试方法都会共用同一个Class1实例:
namespace TestProject1 { [TestClass] public class UnitTest1 { // 静态成员,所有测试共享同一个Class1实例 private static Class1 _sharedClass1; // 在整个测试类的所有测试执行前仅初始化一次 [ClassInitialize] public static void SetupTestClass(TestContext context) { _sharedClass1 = new Class1(); } [TestMethod] public void Adding_Storage() { _sharedClass1.add(5); int result = _sharedClass1.temp(); Assert.AreEqual(5, result); } [TestMethod] public void Display_Storage() { int result = _sharedClass1.temp(); Assert.AreEqual(5, result); } } }
方案2:合并相关测试(不推荐)
如果只是验证连续操作的结果,可以把两个测试逻辑合并到同一个TestMethod中,但这种做法会破坏单元测试的独立性,一个步骤失败会导致整个测试失败,不利于定位问题:
[TestMethod] public void AddAndDisplay_Storage() { Class1 class1 = new Class1(); // 执行添加操作 class1.add(5); Assert.AreEqual(5, class1.temp()); // 验证后续获取的结果 Assert.AreEqual(5, class1.temp()); }
注意事项
共享测试实例状态会让测试方法之间产生依赖,一个测试的执行结果会影响另一个测试的结果,不符合单元测试"独立可重复"的原则。除非有特殊业务场景需要,否则建议每个测试方法自行初始化所需的对象和状态,保持测试的独立性。
内容的提问来源于stack exchange,提问作者Ouckahs
相关产品推荐
相关产品推荐

