Каков наилучший способ написания модульных тестов в Dart?

У Dart пока нет специальной платформы для тестирования модулей. Каков наилучший подход к написанию и проведению модульных тестов?

В исходном коде Дарта есть примеры очень низкого уровня (например,\tests\corelib\src\ListTest.dart), например:

class ListTest {

  static testMain() {
    testList();
    testExpandableList();
  }

  static void testList() { ... }
  static void testExpandableList() { ... }
}

main() {
  ListTest.testMain();
}

Является ли это рекомендуемым способом написания тестов в Dart, или есть ли какие-либо усилия, чтобы облегчить его работу с какой-либо библиотекой тестирования модулей, например x-unit?

Есть ли простой способ запускать все блок-тесты, написанные таким образом, и увидеть результаты?

Ответы

Ответ 1

Единичное тестирование в Dart все еще находится в стадии разработки. Мы (авторы Дарта) в настоящее время используем python script (tools/test.py) для выполнения всех наших тестов. script проходит через предопределенные каталоги, ищет файлы, заканчивающиеся на "Test", выполняет их и сравнивает их с ожидаемым результатом.

Несколько дней назад была отправлена ​​первая версия test.dart(эквивалент в Dart). В ближайшее время мы переключимся с tools/test.py на tools/test.dart, чтобы выполнить все наши тесты.

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

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

Изменить: В клиенте/тестировании/unittest/существует также единичная тестовая среда. См. здесь для тестирования с использованием этой структуры. Это также имеет то преимущество, что он работает в браузере.

Ответ 2

dartlang.org содержит очень длинную статью о текущем состоянии модульное тестирование в дротике. Документацию API можно найти здесь.

import 'package:unittest/unittest.dart';

void main() {
  test('QuickSort', () =>
    expect(QuickSort([5, 4, 3, 2, 1]),
      orderedEquals([1, 2, 3, 4, 5]))
  );
}

int _Partition(List array, int left, int right, int pivotIndex) {
  var pivotValue = array[pivotIndex];
  array[pivotIndex] = array[right];
  array[right] = pivotValue;
  var storeIndex = left;
  for (var i = left; i < right; i++) {
    if (array[i] < pivotValue) {
      var tmp = array[i];
      array[i] = array[storeIndex];
      array[storeIndex] = tmp;
    }
  }
  var tmp = array[storeIndex];
  array[storeIndex] = array[right];
  array[right] = tmp;
  return storeIndex;
}

void _QuickSort(List array, int left, int right) {
  if (left < right) {
    int pivotIndex = left + ((right-left) / 2);
    pivotIndex = _Partition(array, left, right, pivotIndex);
    _QuickSort(array, left, pivotIndex-1);
    _QuickSort(array, pivotIndex+1, right);
  }
}

List QuickSort(List array) {
  _QuickSort(array, 0, array.length-1);
  return array;
}

Ответ 3

This post от "Adam Coding" (через G +) дает очень подробное описание текущего состояния дротика модульное тестирование, с хорошими снимками экрана в окне просмотра в вашем браузере.

Ответ 4

Используйте пакет test Dart https://pub.dartlang.org/packages/test

Этот пакет ранее был назван unittest, который теперь устарел, но вы можете столкнуться с его старыми статьями. Новые тесты должны быть написаны для пакета "test".

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