Статьи » Библиотека модульного тестирования unittest - выполнение определенного набора тестов
Библиотека модульного тестирования unittest - выполнение определенного набора тестов
В любой современной методологии разработки ПО тестирование является неотъемлемой частью процесса, а значимость его написания не ниже значимости написания кода. Для большинства популярных языков программирования высокого уровня существуют инструменты и библиотеки модульного тестировани, язык dart не является исключеним - dart sdk комплектуется библиотекой для автомтического тестирования приложений - unittest
.
По умолчанию, выполняются все тесты, собранные в одном файле, но в некоторых случаях это бывает неудобно, потому что требуется выполнить только один или несколько тестов из всего набора. Комментировать большие участки кода, или выносить все в отдельные файлы достаточно трудоемко, поэтому для таких случаев есть несколько штатных возможностей:
- Чтобы запустить только один тест, необходимо, использовать функцию
solo_test()
, просто заменив обычный вызов тестаtest()
наsolo_test()
, и тогда выполнется только этот определенный тест, из всего набора. - Другой способ для выборочного запуска тестов, состоит в использовании функции
filterTests()
, которая принимает в качестве аргумента строку (String
) или регулярное выражение (RegExp
), а потом последовательно сравнивается названия тестов со этой строкой или регулярным выражением, и если обнаруживается соответсвие, то тест исполняется.
Выборочный запуск тестов с помощью функции filterTests()
Рассмотрим более детально второй случай, здесь недостаточно просто вызывать функцию filterTests()
- во-первых, перед запуском filterTests()
- необходимо отключить автовыполнение тестов в приложении, что можно легко сделать с помощью класса Configuration, и опции autoStart. А во-вторых, после объявления всех тестов, нужно вызвать filterTests()
для фильтрации тестов и runTests()
для запуска:
// объявляем новый класс для конфигурации, в котором отключен автозапуск тестов class FilterTests extends Configuration { get autoStart => false; } void main() { // инициализируем нашу новую конфигурацию configure(new FilterTests()); ensureInitialized(); ... // объявляем тесты ... // фильтруем filterTests('ключевое слово'); // запускаем отобранные тесты runTests(); }
Полностью пример будет выглядить таким образом:
// подключаем библиотеку для тестирования к нашему проекту import "package:unittest/unittest.dart"; // объявляем конфигурацию class FilterTests extends Configuration { // отключаем автозапуск get autoStart => false; } void main() { // инициализируем конфигурацию без автозапуска тестов configure(new FilterTests()); ensureInitialized(); // тест 1 test("simple test 1", () { isTrue(true); }); // тест 2 test("simple test 2", () { isFalse(false); }); // тест 3 test("test fail", () { fail("тест провалился"); }); // группа тестов group("simple group", () { test("subtest1", (){ expect('unit', equals('test')); }); test("subtest2", (){ expect('test', equals('unit')); }); }); // тест с исключением test("complex exception", () { Expect.throws(() { throw new ArgumentError(); }, (e) => e is ArgumentError); }); // с помощью данного вызова выполнятся первые три теста, потому что в их названиях встречается подстрока "test", а так же // тесты из группы "simple group" filterTests('test'); // выберем только последний тест filterTests('complex'); // выберем тесты из группы "simple group" filterTests('group'); // запускаем выполнение тестов runTests(); }
Стоит отметить, что для корректного запуска, в данном примере, стоит закомментировать все вызовы filterTests кроме одного, в противном случае, будут выполнятся только те тесты, которые одновременно удволетворяют сразу всем условиям filterTests()
.
Выборочный запуск тестов с помощью аргументов командной строки
Чтобы сделать запуск тестов еще более удобным, можно расширить функциональность нашего приложения таким образом, чтобы передавать аргумент в функцию filterTests()
с помощью коммандной строки. Тогда мы сможем запускать необходимый набор тестов без изменения исходного кода и перекомпиляцией программы.
// подключаем библиотеку для тестирования к нашему проекту import "package:unittest/unittest.dart"; // подключаем библиотеку для работы с аргументами коммандной строки import "package:args/args.dart"; // объявляем конфигурацию class FilterTests extends Configuration { // отключаем автозапуск get autoStart => false; } void main() { // инициализируем конфигурацию без автозапуска тестов configure(new FilterTests()); ensureInitialized(); // объявлем парсер аргументов командной строки ArgParser argParser = new ArgParser(); Options options = new Options(); // разбираем аргументы коммандной строки ArgResults results = argParser.parse(options.arguments); // и передаем результат в массив строк Listargs = results.rest; // тест 1 test("simple test 1", () { isTrue(true); }); // тест 2 test("simple test 2", () { isFalse(false); }); // тест 3 test("test fail", () { fail("тест провалился"); }); // группа тестов group("simple group", () { test("subtest1", (){ expect('unit', equals('test')); }); test("subtest2", (){ expect('test', equals('unit')); }); }); // тест с исключением test("complex exception", () { Expect.throws(() { throw new ArgumentError(); }, (e) => e is ArgumentError); }); // в случае, если переданы аргументы в командной строке, выбираем необходимы тесты if (!args.isEmpty) { filterTests(args[0]); } // запускаем выполнение тестов runTests(); }
Теперь запуск тестов будет осуществлятся с помощью командной строки:
dart tests.dart [ключевое слово или имя теста] // выполним тесты 1, 2 и все тесты из группы "simple group" dart tests.dart simple // выполним тест с исключением dart tests.dart exception // выполнятся все тесты dart tests.dart
На основе стать из блога Shailen Tuli's blog, "Running Only Some of Your Tests" http://shailen.github.com/blog/2012/12/07/running-only-some-of-your-tests/