На стороне сервера у нас есть Rspec/Cucumber для разработки BDD (ruby) vowsjs (node.js)
Есть ли рамки BDD для использования в веб-браузерах (а не qUnit или YUI-тест, поскольку они предназначены только для TDD)?
На стороне сервера у нас есть Rspec/Cucumber для разработки BDD (ruby) vowsjs (node.js)
Есть ли рамки BDD для использования в веб-браузерах (а не qUnit или YUI-тест, поскольку они предназначены только для TDD)?
Проверьте жасмин
describe("Jasmine", function() {
it("makes testing JavaScript awesome!", function() {
expect(yourCode).toBeLotsBetter();
});
});
http://pivotal.github.com/jasmine/
https://github.com/pivotal/jasmine
Should_be (sic), очень знакомый рубину
Вы также можете посмотреть Yadda. Вместо того, чтобы быть автономной тестовой средой, такой как CucumberJS, она позволяет использовать синтаксис типа Gherkin из других фреймворков, таких как Mocha, Jasmine, CasperJS, Zombie, Qunit и т.д.
Я бы второй Jasmine, а также взглянуть на Jasmine-species
Также обратите внимание: Kyuri - это парсер Gherkin (Cucumber DSL) для javascript, изначально он предназначался для Vows.js, но он также может генерировать простые старые javascript-заглушки (однако, он по-прежнему довольно глючит прямо сейчас).
Здесь приведен список схем тестирования, перечисленных в wiki node.
cucumber-js выглядит многообещающим. Здесь образец синтаксиса:
Источник функций
Feature: Simple maths
In order to do maths
As a developer
I want to increment variables
Scenario: Increment variable once
Given a variable set to 1
When I increment the variable by 1
Then the variable should contain 2
Определения шага
var variable;
Given(/^a variable set to (\d+)$/, function(number, callback) {
variable = parseInt(number);
callback();
});
When(/^I increment the variable by (\d+)$/, function(number, callback) {
variable += parseInt(number);
callback();
});
Then(/^the variable should contain (\d+)$/, function(number, callback) {
if (variable != parseInt(number))
throw(new Error('Variable should contain '+number+' but it contains '+variable+'.'));
callback();
});
Я думаю, что жасмин - это просто TDD-фреймворк, а не BDD, потому что у него нет двух уровней абстракции. Структуры BDD имеют:
Но это хорошо, это хорошая отправная точка. Мне не нравится изобретать колесо (используя язык на основе txt). Я нашел структуру BDD, которая строится на жасмине, для меня это было идеальным решением: https://github.com/DealerDotCom/karma-jasmine-cucumber
Например:
specs.js(что мы делаем)
feature('Calculator: add')
.scenario('should be able to add 2 numbers together')
.when('I enter "1"')
.and('I add "2"')
.then('I should get "3"')
.scenario('should be able to add to a result of a previous addition')
.given('I added "1" and "2"')
.when('I add "3"')
.then('I should get "6"')
steps.js(как мы это делаем)
featureSteps('Calculator:')
.before(function(){
this.values = [];
this.total = null;
})
.given('I added "(.*)" and "(.*)"', function(first, second){
this.when('I enter "' + first + '"');
this.when('I add "' + second + '"');
})
.when('I enter "(.*)"', function(val){
this.values.push(val * 1);
})
.when('I add "(.*)"', function(val){
this.values.push(val * 1);
this.total = this.values[0] + this.values[1];
this.values = [this.total];
})
.then('I should get "(.*)"', function(val){
expect(this.total).toBe(val * 1);
})
Обновление 2016-02-16:
После нескольких месяцев практики с BDD я закончил описания функций на основе txt и ofc. с огурцами. Я думаю, что лучше писать что-то действительно высокое значение абстракции в описаниях функций, а не то, что я ранее писал в моем примере с карма-жасмином-огурцом. По моему старому примеру я бы скорее написал что-то вроде этого в настоящее время:
Scenario: Addition of numbers
Given I have multiple numbers
When I add these numbers together
Then I should get their sum as result
Вот как мне это нравится в настоящее время. Я использую, чтобы определения шага устанавливали значения приборов и утверждений, но ofc. вы можете дать Examples
gherkin, если хотите:
Scenario: Addition of numbers
Given I have <multiple numbers>
When I add these numbers together
Then I should get <their sum> as result
Examples:
| multiple numbers | their sum |
| 1, 2, 3, 6 | 12 |
| 8, 5 | 13 |
| 5, -10, 32 | 27 |
Cucumber переводит эти 3 строки в 3 сценария, например:
Given I have 1, 2, 3, 6
When I add these numbers together
Then I should get 12 as result
Может быть, это немного легче отлаживать, но вам нужно написать парсер для этих значений, например, разбить строку "1, 2, 3, 6" и parseInt значения, чтобы получить массив чисел. Я думаю, вы можете решить, какой путь лучше для вас.
Что действительно интересно с описанием функций уровня абстракции, что вы можете написать несколько разных определений шагов. Например, вы можете протестировать 2 разных apis, которые делают то же самое, или придерживаться примера калькулятора, вы можете написать тесты e2e для нескольких пользовательских интерфейсов (cli, webapplication и т.д.), Или вы можете написать простой тест, который тестирует только домен. В любом случае описания функций более или менее многоразовые.
Обновление 2016-04-15:
Я решил использовать Yadda с mocha вместо Cucumber с jasmine. Мне нравились огурцы и жасмин, но я думаю, что Yadda и мокка более гибкие.
Теперь есть karma-cucumberjs, которые могут тестировать огурцы в реальных браузерах, а также PhantomJS.