C# 如何以编程方式运行同一Nunit测试两次?
我使用RestSharp测试api,我有一个delete调用,我想在同一个方法中运行两次。 delete调用将使用两个不同的查询参数删除。它一次只能接受一个查询参数,所以我想用两个不同的查询参数调用它两次。这方面的最佳优化解决方案是什么。 下面的示例是我正在使用用户id 1删除的,我还想使用用户id 2删除C# 如何以编程方式运行同一Nunit测试两次?,c#,api,testing,nunit,C#,Api,Testing,Nunit,我使用RestSharp测试api,我有一个delete调用,我想在同一个方法中运行两次。 delete调用将使用两个不同的查询参数删除。它一次只能接受一个查询参数,所以我想用两个不同的查询参数调用它两次。这方面的最佳优化解决方案是什么。 下面的示例是我正在使用用户id 1删除的,我还想使用用户id 2删除 [Test] public void DeletedUser() { response = HttpDelete(&
[Test]
public void DeletedUser()
{
response = HttpDelete("url");
QueryParam.Add("id", 1);
Assert.statusCode(200, response);
}
我使用了Andy解决方案来使用TestCase属性,但在尝试不硬编码正在使用的数据时出现了语法错误。
错误消息:“属性参数必须是常量表达式、typeof表达式或属性参数类型的数组创建表达式”
例
我需要使用两个动态测试数据运行调用。数据是在Delete调用之前从Post调用生成的,它被保存并序列化到一个类中,在这个类中我有数据变量。。
下面是存储测试数据的类的示例
public class Data
{
public class UserData
{
public string id1;
public string id2;
public UserData()
{
id1 = "";
id2 = "";
}
}
}
这是Post调用以及数据的保存方式
[Test]
public void AddUser()
{
response = HttpPost("url", modle);
Data data = new Data()
data.UserData.id1 = response.content;
}
现在如何在我的TestCase属性中使用data.UserData.id1您可以使用NUnit的
[TestCase]
属性使用不同的参数多次运行测试
示例
[TestCase(1)]
[TestCase(2)]
public void DeletedUser(int id)
{
response = HttpDelete("url");
QueryParam.Add("id", id);
Assert.statusCode(200, response);
}
您可以使用完成测试所需的任意多个参数来扩展此功能。例如,如果您希望不同ID有不同的响应:
[TestCase(1, 200)]
[TestCase(2, 404)]
public void DeletedUser(int id, int expectedResponseCode)
{
response = HttpDelete("url");
QueryParam.Add("id", id);
Assert.statusCode(expectedResponseCode, response);
}
提供完整的文档
更新
[TestCase(1)]
[TestCase(2)]
public void DeletedUser(int id)
{
response = HttpDelete("url");
QueryParam.Add("id", id);
Assert.statusCode(200, response);
}
在回答您关于使用动态数据进行测试的进一步问题时,正如Charlie所说,您只能从属性中引用文本或文本常量,因此您将无法对动态数据使用[TestCase]
相反,您可以使用[TestCaseSource]
属性。创建一个静态方法,用于检索测试数据并返回数组,然后在属性中引用此方法的名称
private static int[] GetIdsToDelete() {
// UserData userData = ... read in data
return new int[] {
userData.id1,
userData.id2
}
}
[TestCaseSource(nameof(GetIdsToDelete))]
public void DeletedUser(int id)
{
response = HttpDelete("url");
QueryParam.Add("id", id);
Assert.statusCode(200, response);
}
您可以找到TestCaseSource的完整文档。这似乎与Theory标记的预期用途不匹配。事实上,您可以在上面的示例中用Test替换它,它将完全满足OP的要求。啊,我的错误,我删除了theory属性。谢谢,当我硬编码数据时,这是有效的,但是当我从xml文件读取数据时,我会得到一个语法错误“属性参数必须是常量表达式、typeof表达式或属性参数类型的数组创建表达式”此外,我刚刚声明了要使用的公共静态字符串,但仍然得到相同的错误..我在原始问题中包含了它。公共静态字符串不是常量表达式。如果声明
const string data=”1“
它将被编译,但您当然无法再对其进行更改。此限制是C#的一个“功能”,与NUnit无关。