Статьи » Библиотека модульного тестирования 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);
  // и передаем результат в массив строк
  List args = 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/