BDD для интерфейса?
На стороне сервера у нас есть Rspec/Cucumber для разработки BDD (ruby) vowsjs (node.js)
Есть ли рамки BDD для использования в веб-браузерах (а не qUnit или YUI-тест, поскольку они предназначены только для TDD)?
Ответы
Ответ 1
Проверьте жасмин
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), очень знакомый рубину
Ответ 2
Вы также можете посмотреть Yadda. Вместо того, чтобы быть автономной тестовой средой, такой как CucumberJS, она позволяет использовать синтаксис типа Gherkin из других фреймворков, таких как Mocha, Jasmine, CasperJS, Zombie, Qunit и т.д.
Ответ 3
Я бы второй Jasmine, а также взглянуть на Jasmine-species
Также обратите внимание: Kyuri - это парсер Gherkin (Cucumber DSL) для javascript, изначально он предназначался для Vows.js, но он также может генерировать простые старые javascript-заглушки (однако, он по-прежнему довольно глючит прямо сейчас).
Ответ 4
Здесь приведен список схем тестирования, перечисленных в 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();
});
Ответ 5
Я думаю, что жасмин - это просто TDD-фреймворк, а не BDD, потому что у него нет двух уровней абстракции. Структуры BDD имеют:
- Что нам делать? (обычно в txt файлах)
- Как мы это делаем? (возможность повторного использования в javascript)
Но это хорошо, это хорошая отправная точка. Мне не нравится изобретать колесо (используя язык на основе 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 и мокка более гибкие.
Ответ 6
Теперь есть karma-cucumberjs, которые могут тестировать огурцы в реальных браузерах, а также PhantomJS.
https://github.com/s9tpepper/karma-cucumberjs