You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 13:02:41