C# 如何以编程方式运行同一Nunit测试两次?

C# 如何以编程方式运行同一Nunit测试两次?,c#,api,testing,nunit,C#,Api,Testing,Nunit,我使用RestSharp测试api,我有一个delete调用,我想在同一个方法中运行两次。 delete调用将使用两个不同的查询参数删除。它一次只能接受一个查询参数,所以我想用两个不同的查询参数调用它两次。这方面的最佳优化解决方案是什么。 下面的示例是我正在使用用户id 1删除的,我还想使用用户id 2删除 [Test] public void DeletedUser() { response = HttpDelete(&

我使用RestSharp测试api,我有一个delete调用,我想在同一个方法中运行两次。 delete调用将使用两个不同的查询参数删除。它一次只能接受一个查询参数,所以我想用两个不同的查询参数调用它两次。这方面的最佳优化解决方案是什么。 下面的示例是我正在使用用户id 1删除的,我还想使用用户id 2删除

       [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无关。