![](/img/trans.png)
[英]Is there a way to pass delegates to a NUnit TestCase or TestFixture?
[英]NUnit TestFixture and TestCase
我必须用 NUnit 编写一些集成测试来测试 HTTP 端点。 这意味着 URL 应该在所有测试方法之间共享。
[TestFixture("http://my.endpoint.com")]
public class TestSuiteOne
{
[TestCase(10, 20, Expected = 30)]
[TestCase(20, 30, Expected = 50)]
public int TestA(int a, int b, HttpResponseMessage sut)
{
// AAA.
}
[TestCase("XXX", "YYY", Expected = "ABC")]
public int TestA(string a, string b, HttpResponseMessage sut)
{
// AAA.
}
}
要在来自测试套件属性的每个测试运行中获取 SUT 值,我知道两个选项:
选项 A(从类属性中读取 SUT)
public abstract class TestSuiteBase
{
protected(string endpoint)
{
Sut = endpoint;
}
protected HttpResponseMessage Sut { get; }
}
[TestFixture("http://my.endpoint.com")]
public class TestSuiteOne : TestSuiteBase
{
public TestSuiteOne(string endpoint) : base(endpoint)
{
}
[TestCase(10, 20, Expected = 30)]
[TestCase(20, 30, Expected = 50)]
public int TestA(int a, int b)
{
// act (read content/response code/headers/etc); Making a call I do not consider as act.
var actual = Sut.DoSomething();
// assert
}
[TestCase("XXX", "YYY", Expected = "ABC")]
public int TestA(string a, string b)
{
// act (read content/response code/headers/etc); Making a call I do not consider as act.
var actual = Sut.DoSomething();
// assert
}
}
选项 B(拦截测试方法调用)
public class MyTestCase: TestCaseAttribute
{
public MyTestCase(params object[] args) : base(Resize(args))
{
}
// I do resize before method call because VS Test Adapters discover tests to show a list in the test explorer
private static object[] Resize(params object[] args)
{
Array.Resize(ref args, args.Length + 1);
args[args.Length - 1] = "{response}";
return args;
}
}
public abstract class TestSuiteBase
{
[SetUp]
public void OnBeforeTestRun()
{
var ctx = TestContext.CurrentContext;
var args = ctx.Test.Arguments;
// Making a call I do not consider as act.
args[args.Length - 1] = MakeCallAndGetHttpResponseMessage(args);
}
}
[TestFixture("http://my.endpoint.com")]
public class TestSuiteOne : TestSuiteBase
{
[MyTestCase(10, 20, Expected = 30)]
[MyTestCase(20, 30, Expected = 50)]
public int TestA(int a, int b, HttpResponseMessage sut)
{
// act (read content/response code/headers/etc); Making a call I do not consider as act.
var actual = sut.DoSomething();
// assert
}
[MyTestCase("XXX", "YYY", Expected = "ABC")]
public int TestA(string a, string b, HttpResponseMessage sut)
{
// AAA.
}
}
有没有更方便的方法如何将来自 TestFixture 的值与 TestCase 结合起来?
由于您将端点字符串放在TestFixtureAttribute
,我将假设
您的示例中唯一缺少的是一个构造函数,它将接受您提供的参数。 只需添加类似...
public TestSuiteOne(string url)
{
Sut = endpoint;
}
只要您将Sut
设为只读属性或字段,您的任何测试用例都无法更改它,无论它们是按顺序运行还是并行运行。
您提供的两个选项对我来说似乎都过于复杂,至少就您对问题的解释而言。 第一个最接近这个答案。
当然,您完全有可能对网站做其他事情,这会导致并行(甚至顺序)测试相互干扰。 不要那样做。 :-) 说真的,共享驱动程序与共享字符串完全不同,但这是一个不同的问题。
顺便说一句,IMO,您和您的团队应该习惯一个或另一个测试框架。 您提到的生命周期问题并不是 NUnit 和 xUnit 之间唯一的细微差别!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.