Внешний файл данных для модульных тестов

Проблема, которую Вы описываете, может быть решена путем определения шаблона в заголовке, или через подход Вы описываете выше.

я рекомендую читать следующие моменты из FAQ C++, Облегченный :

Они вдаются в большое количество подробностей о них (и другой) шаблонные проблемы.

5
задан John Gallagher 4 July 2009 в 22:10
поделиться

3 ответа

In general, use a test data file only when it's necessary. There are a number of disadvantages to using a test data file:

  • The code for your test is split between the test code and the test data file. This makes the test more difficult to understand and maintain.
  • You want to keep your unit tests as fast as possible. Having tests that unnecessarily read data files can slow down your tests.

There are a few cases where I do use data files:

  • The input is large (for example, an XML document). While you could use String concatenation to create a large input, it can make the test code hard to read.
  • The test is actually testing code that reads a file. Even in this case, you might want to have the test write a sample file in a temporary directory so that all of the code for the test is in one place.

Instead of encoding the valid and invalid URLs in the file, I suggest writing the tests in code. I suggest creating a test for invalid characters, a test for invalid protocol(s), a test for invalid domain(s), and a test for a valid URL. If you don't think that has enough coverage, you can create a mini integration test to test multiple valid and invalid URLs. Here's an example in Java and JUnit:

public void testManyValidUrls() {
  UrlValidator validator = new UrlValidator();
  assertValidUrl(validator, "http://foo.com");
  assertValidUrl(validator, "http://foo.com/home");
  // more asserts here
}

private static void assertValidUrl(UrlValidator validator, String url) {
  assertTrue(url + " should be considered valid", validator.isValid(url);
}
5
ответ дан 14 December 2019 в 08:58
поделиться
1
ответ дан 14 December 2019 в 08:58
поделиться

Хотя я думаю, что это вполне разумный вопрос, я не думаю, что вы должны чрезмерно беспокоиться по этому поводу. Строго говоря, вы правы в том, что каждый тест должен проверять только одно, но это не препятствует использованию вами файла данных.

Если ваша тестируемая система (SUT) является простым парсером / валидатором URL, я предполагаю что он принимает один URL в качестве параметра. Таким образом, существует ограничение на количество одновременно недействительных данных, которые вы можете ввести в него. Даже если вы введете URL-адрес, содержащий как недопустимые символы, так и недопустимый протокол, это приведет только к единственному результату (что URL-адрес был недопустимым).

То, что вы описываете, является тестом на основе данных (также называемым Параметризованный тест). Если вы сохраните простоту самого теста, заполнение его другими данными само по себе не будет проблемой.

То, что вы делаете , должно беспокоить, так это то, что вы хотите иметь возможность быстро определить, почему тест не проходит, когда / если это произойдет через несколько месяцев. Если ваш тестовый результат указывает на конкретную строку в вашем файле тестовых данных, вы сможете быстро выяснить, что пошло не так. С другой стороны, если единственное сообщение, которое вы получите, это то, что тест не прошел и любая из строк в файле могла быть неисправной, вы начнете видеть контуры кошмара, связанного с ремонтопригодностью теста.

Лично я немного наклоняюсь. чтобы тестовые данные были как можно более тесно связаны с тестами. Это потому, что я считаю очень важным концепцию тестов как исполняемых спецификаций. Когда тестовые данные жестко закодированы в каждом тесте, они могут очень четко указать взаимосвязь между вводом и ожидаемым выводом. Чем больше вы удаляете данные из самого теста, тем труднее становится читать эту «спецификацию».

Это означает, что я склонен определять значения входных данных в каждом тесте. Если мне нужно написать много очень похожих тестов, где единственным вариантом является ввод и / или ожидаемый результат, я пишу параметризованный тест, но все же вызываю этот параметризованный тест из жестко закодированных тестов (каждый из которых представляет собой только одну строку кода. ). Я не думаю, что когда-либо использовал внешний файл данных.

Но опять же, в наши дни я даже не знаю , каков мой ввод, поскольку я использую Constrained Non -Детерминизм . Вместо этого я работаю с классами эквивалентности и производными значениями .

Это означает, что я стараюсь определять значения входных данных в рамках каждого теста. Если мне нужно написать много очень похожих тестов, где единственным вариантом является ввод и / или ожидаемый результат, я пишу параметризованный тест, но все же вызываю этот параметризованный тест из жестко закодированных тестов (каждый из которых представляет собой только одну строку кода. ). Я не думаю, что когда-либо использовал внешний файл данных.

Но опять же, в наши дни я даже не знаю , каков мой ввод, поскольку я использую Constrained Non -Детерминизм . Вместо этого я работаю с классами эквивалентности и производными значениями .

Это означает, что я стараюсь определять значения входных данных в рамках каждого теста. Если мне нужно написать много очень похожих тестов, где единственным вариантом является ввод и / или ожидаемый результат, я пишу параметризованный тест, но все же вызываю этот параметризованный тест из жестко закодированных тестов (каждый из которых представляет собой только одну строку кода. ). Я не думаю, что когда-либо использовал внешний файл данных.

Но опять же, в наши дни я даже не знаю , каков мой ввод, поскольку я использую Constrained Non -Детерминизм . Вместо этого я работаю с классами эквивалентности и производными значениями .

но по-прежнему вызывать этот параметризованный тест из жестко запрограммированных тестов (каждый из которых представляет собой только одну строку кода). Я не думаю, что когда-либо использовал внешний файл данных.

Но опять же, в наши дни я даже не знаю , каков мой ввод, поскольку я использую Constrained Non -Детерминизм . Вместо этого я работаю с классами эквивалентности и производными значениями .

но по-прежнему вызывать этот параметризованный тест из жестко запрограммированных тестов (каждый из которых представляет собой только одну строку кода). Я не думаю, что когда-либо использовал внешний файл данных.

Но опять же, в наши дни я даже не знаю , каков мой ввод, поскольку я использую Constrained Non -Детерминизм . Вместо этого я работаю с классами эквивалентности и производными значениями .

1
ответ дан 14 December 2019 в 08:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: