在 MSTest 中的每个测试用例之后清除所有静态数据
Clear all static data after each test case in MSTest
我想用 MSTest 为我的库编写测试。在 TestCase1 运行s 之后,它做了一些事情,设置 MyData(我的库内部 class 的私有静态字段)像:
internal MyClass{private static int MyData;}
当 TestCase2 运行s 时,它将重新使用该数据。
我写了一个 Reset 方法并在 TestInitialize 方法中调用它,内容如下:
var type = MyAssembly.GetType("MyClass");
var privateType = new PrivateType(type);
privateType.SetStaticField("MyData", 0);
如您所见,该方法会将静态字段重置为 0,但它需要知道属性名称和 class("MyClass" 和 "MyData")。
现在,我用我的混淆后的dll 进行测试,测试将失败,因为名称将被更改。此外,在我的库中,我引用了第三方库,它也可能将数据存储在静态字段中。它将使TestCase2重新使用由TestCase1和TestCase2设置的数据将永远失败。
如何在 TestInitialize 中重置所有静态字段?
** 更新:
我可以看到一个解决方案,我可以 运行 在单独的 AppDomain 上对每个测试用例进行测试,它可能会变慢,但我可以尝试。问题是我不知道如何正确 运行 单独的 AppDomain 中的每个测试用例?
经过几天的阅读文档和示例,我没有找到更好的解决方案。我和一些同事讨论过,我认为这应该是我测试库设计的问题,而不是我测试设计的问题。
在库静态字段中保存数据并更改它将使该数据与 运行ning 进程或实例耦合。在现实生活中,如果用户 运行 2(或更多)个使用该库的应用程序进程(实例),那么静态数据很容易以不可预知的方式被更改,并带来巨大的灾难。因此,通过清除静态数据来解决我的测试问题只是一个 "let the code go" 技巧,这个棘手的解决方案将真正的问题隐藏在代码中 - 更危险。
Saving data in a static field is really BAD idea。如果该数据不是静态的,请不要这样做。
我想用 MSTest 为我的库编写测试。在 TestCase1 运行s 之后,它做了一些事情,设置 MyData(我的库内部 class 的私有静态字段)像:
internal MyClass{private static int MyData;}
当 TestCase2 运行s 时,它将重新使用该数据。
我写了一个 Reset 方法并在 TestInitialize 方法中调用它,内容如下:
var type = MyAssembly.GetType("MyClass");
var privateType = new PrivateType(type);
privateType.SetStaticField("MyData", 0);
如您所见,该方法会将静态字段重置为 0,但它需要知道属性名称和 class("MyClass" 和 "MyData")。
现在,我用我的混淆后的dll 进行测试,测试将失败,因为名称将被更改。此外,在我的库中,我引用了第三方库,它也可能将数据存储在静态字段中。它将使TestCase2重新使用由TestCase1和TestCase2设置的数据将永远失败。
如何在 TestInitialize 中重置所有静态字段?
** 更新:
我可以看到一个解决方案,我可以 运行 在单独的 AppDomain 上对每个测试用例进行测试,它可能会变慢,但我可以尝试。问题是我不知道如何正确 运行 单独的 AppDomain 中的每个测试用例?
经过几天的阅读文档和示例,我没有找到更好的解决方案。我和一些同事讨论过,我认为这应该是我测试库设计的问题,而不是我测试设计的问题。
在库静态字段中保存数据并更改它将使该数据与 运行ning 进程或实例耦合。在现实生活中,如果用户 运行 2(或更多)个使用该库的应用程序进程(实例),那么静态数据很容易以不可预知的方式被更改,并带来巨大的灾难。因此,通过清除静态数据来解决我的测试问题只是一个 "let the code go" 技巧,这个棘手的解决方案将真正的问题隐藏在代码中 - 更危险。
Saving data in a static field is really BAD idea。如果该数据不是静态的,请不要这样做。