Как программно запустить один и тот же тест Nunit дважды?

#c# #api #testing #nunit

#c# #API #тестирование #nunit

Вопрос:

Я использую RestSharp для тестирования API, и у меня есть вызов delete, который я хочу запустить дважды одним и тем же методом. Вызов delete приведет к удалению с двумя разными параметрами запроса. Он может принимать только один параметр запроса за раз, поэтому я хочу вызвать его дважды с двумя разными параметрами запроса. Каково наилучшее оптимизированное решение для этого. Приведенный ниже пример я удаляю с идентификатором пользователя 1, и я хочу также удалить с идентификатором пользователя 2

        [Test]
        public void DeletedUser()
        {
              response = HttpDelete("url");
              QueryParam.Add("id", 1);
              Assert.statusCode(200, response);
          
      }
  

Я использовал решение Andy для использования атрибута TestCase, но я получаю синтаксическую ошибку при попытке не жестко закодировать используемые данные.
Сообщение об ошибке: «Аргумент атрибута должен быть постоянным выражением, выражением типа typeof или выражением создания массива типа параметра атрибута»

пример..

      public static string data = "1"
 
      [TestCase(data)] //Getting the error here
      [Test]
        public void DeletedUser(string id)
        {
              response = HttpDelete("url");
              QueryParam.Add("id", id);
              Assert.statusCode(200, response);

      }
  

Мне нужно запустить вызов, используя два динамических тестовых данных. Данные генерируются из Post-вызова перед вызовом Delete, сохраняются и сериализуются в класс, где у меня есть переменные данных..
Вот пример класса, в котором хранятся тестовые данные

 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;
}
  

Как я могу теперь использовать эти данные.UserData.id1 в моем атрибуте TestCase

Ответ №1:

Вы можете использовать [TestCase] атрибут NUnit для запуска теста несколько раз с разными параметрами.

Пример

 [TestCase(1)]
[TestCase(2)]
public void DeletedUser(int id)
{
    response = HttpDelete("url");
    QueryParam.Add("id", id);
    Assert.statusCode(200, response);

}
  

Вы можете расширить это с таким количеством параметров, сколько необходимо для завершения теста. Например, если вы ожидаете разных ответов для разных идентификаторов:

 [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] с динамическими данными.

Вместо этого вы могли бы использовать [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 здесь .

Комментарии:

1. Похоже, это не соответствует предполагаемому использованию тега Theory. Действительно, вы могли бы просто заменить его на Test в приведенном выше примере, и он выполнял бы именно то, что просил OP.

2. Ах, моя ошибка, я удалил атрибут теории.

3. спасибо, это работает, когда я жестко кодирую свои данные, но когда я считываю свои данные из XML-файла, я получаю синтаксическую ошибку «Аргумент атрибута должен быть постоянным выражением, выражением typeof или выражением создания массива типа параметра атрибута»

4. Кроме того, я просто объявляю общедоступную статическую строку для использования, но все равно получаю ту же ошибку.. Я включил это в исходный вопрос.

5. Общедоступная статическая строка не является постоянным выражением. Если вы объявили const string data = "1" , он будет компилироваться, но, конечно, вы больше не сможете его изменять. Это ограничение является «особенностью» C # и не имеет ничего общего с NUnit.