Уникальная особенность Venus.js , JavaScript- бегуна из LinkedIn, заключается в том, что конфигурация теста может быть в форме исходной аннотации . Это полезно, например, для выбора библиотеки тестов ( Mocha , Jasmine , QUnit ), которая будет использоваться для выполнения тестов. Разве не было бы здорово, если бы тестируемый мог автоматически выводить указанную библиотеку?
Во время беседы за чашкой кофе я предложил такую идею обнаружения наилучшего усилия моему коллеге-инженеру Shape Security Сету (который связан с Venus.js). Очевидно, что этот тип обнаружения может быть не на 100% точным. Однако я постулирую, что это должно быть достаточно хорошо в большинстве случаев, особенно в случае, когда аннотация отсутствует.
В качестве подтверждения концепции я реализовал detect-testlib.js
(см. Репозиторий Git по адресу bitbucket.org/ariya/detect-testlib ). Он использует Esprima для анализа кода теста, сбора важных глаголов (подробнее об этом позже), а затем с помощью собранной информации решите, написан ли тест в Jasmine или qUnit, или он полностью неизвестен. Чтобы продолжить, клонируйте репо, запустите npm install
сначала и попробуйте следующее:
node detect-testlib.js test/jquery-attributes.js
Это jquery-attributes.js
взято из реальных модульных тестов jQuery. Как и ожидалось, обнаружение-testlib с уверенностью скажет, что эти тесты используют qUnit. Для другой попытки, проверьте test/yeoman-env.js
(снова, взятый из основанных на жасмине Еоманских тестов).
Как работает обнаружение? Есть много разных способов реализовать это. Для этого доказательства концепции я выбрал что-то простое. Инструмент отсканирует названия функций (также известные как глаголы), которые используются на верхнем и вторичном уровнях. Другими словами, дан следующий код:
describe("sqrt", function() { it('computes the square root of 9 as 3', function() { expect(My.sqrt(9)).toBeCloseTo(3, 10); }); }
затем он будет собираться describe
в группе верхнего уровня и it
в группе уровня тестирования. Через некоторое время мы заполним эти два массива (без дубликатов). Например, его запуск test/jquery-attributes.js
даст массивы как:
{ topLevel: ['module', 'test' ], testLevel: [ 'expect', 'deepEqual', 'equal', 'ok', 'strictEqual', 'testVal', 'testAddClass', 'testRemoveClass', 'testToggleClass' ] }
Как только массив получен, специальная decide()
функция будет использовать простую эвристику для определения библиотеки, используемой в тестовом коде. В качестве иллюстрации для приведенного выше примера будет сделан вывод, что в тесте используется жасмин (в зависимости от наличия describe
и it
). Для другого тестового кода, подобного следующему:
test("sqrt", function() { equal(My.sqrt(4), "2", "Check for square root of 4" ); });
тогда decode()
пойдет на QUnit в качестве решения.
Очевидно, что в некоторых угловых случаях это простое правило принятия решения потерпит неудачу. Однако, это ожидается, так как это довольно минималистично. Вам предлагается разработать более сложную реализацию классификации в случае, если для вашего приложения требуется более точное решение.
Как насчет мокко? Поскольку Mocha может поддерживать стиль TDD и BDD, фактор принятия решений более сложный. Возможное решение состоит в том, чтобы обнаружить механизм утверждений и сопоставить его с типичным шаблоном утверждений (wait.js, Chai и т. Д.), Используемым с Mocha.
Удачи с автоопределением!