#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.