我有一个单元测试项目,其中包含所有平台的所有测试。但是根据平台类型,我需要在测试用例中进行检查。例如,如果我有这样的内容:
[TestCase]
public void Do_Sth_ExpectSth()
{
//Arrange
//....
//Act
//....
//Assert
if(TestPlatform.IsMainLine)
{
Assert.That(...); //assert something based on MainLine platform
}
else
{
Assert.That(.....); // assert something else for non mainline platforms
}
}
我可以通过在TestCase(...)
属性中传递PlatformType枚举来测试每个平台,但是在某个时候,我认为只对全局配置一次平台类型,并在项目中针对每种平台类型运行每个测试。
所以,我可能会遇到这样的事情:
[SetUpFixture]
public class GlobalSetup
{
[OneTimeSetUp(PlatformType.MainLine)]
[OneTimeSetUp(PlatformType.Other)]
public void Configure(PlatformType platform)
{
TestPlatform.SetPlatform(platform);
//other stuff
}
[OneTimeTearDown]
public void Reset()
{
//reset
}
}
这将对我有帮助,因为每个单元测试都将在特定的平台类型下运行,但是在大多数情况下,我不必更改每种平台类型的代码并再次运行测试项目(喜欢)。因此,我在考虑是否有一种OneTimeSetUp
属性可以接受参数,然后针对不同的参数重新运行每种测试方法。我宁愿选择此方法,也不愿在每种测试方法中都设置PlatformType
,因为我会根据平台类型在全局范围内进行一些自动映射器配置。
感谢您的帮助!
答案 0 :(得分:1)
OneTimeSetUpAttribute
仅具有默认构造函数,因此无法传递参数。此外,相同的方法不可能一次标记两次。可以在两种不同的方法上使用两次该属性,但是在这种情况下,它们都被称为同一夹具。
另一种方法是向SetUpFixtureAttribute
提供参数。该功能不可用,但与NUnit处理TestFixtureAttribute
的方式一致。假设,NUnit可以创建SetUpFixture
多次,并将参数存储(在某个地方)并由其下的固定装置访问,该参数也可以多次创建。这是添加到NUnit的重要功能,但是您可以请求它。
没有这种功能,您最好的办法是对每个需要它们的TestFixture
使用相同的参数...
[TestFixture(PlatformType.Mainline)]
[TestFixture(PlatformType.Other)]
public class MyTestFixture
{
private PlatformType _platform;
public MyTestFixture(PlatformType platform)
{
_platform = platform;
}
...
}
如果不想在每个类中都重复此操作,则可以对在多个平台上运行的测试使用基类,将属性放在基类上。除非您有很多这样的类,否则我自己的倾向是重复属性,因为这样会使人们更容易阅读代码以了解发生了什么。