Upload
others
View
10
Download
0
Embed Size (px)
Citation preview
Автоматическое тестирование в JavaScript
Тестирование
Процесс исследования программного продукта, имеющий своей целью проверку соответствия между реальным поведением программы и её ожидаемым поведением на конечном наборе тестов
2
Зачем нужны тесты?
• Убрать ручные запуски как средство проверки правильно ли работает функция
• Один программный код проверяет другой программный код
3
https://learn.javascript.ru/testing
Автоматизированное тестирование
• Тесты написаны отдельно от кода; • В любой момент можно запустить их и
проверить все важные случаи использования.
4
https://learn.javascript.ru/testing
Плюсы тестирования
• Моментальное обнаружение дефектов
• Локализация проблемы
• Ускорение разработки
• Актуальная документация
BDD Behavior Driven Development
7
BDD
• Поведенческое тестирование кода • Тесты BDD:
– Тесты, – Документация, – Примеры использования.
8
Пример Допустим, мы хотим разработать функцию pow(x, n), которая возводит x в целую степень n, для простоты n≥0. Спецификация: describe("pow", function() {
it("возводит в n-ю степень", function() { assert.equal(pow(2, 3), 8);
}); });
9
Поток разработки BDD
1. Создание спецификация 2. Реализация спецификации. 3. Запуск тестов it и вывод ошибок, если они
возникнут. При ошибках вносятся исправления. 4. Расширение спецификации
Добавляются возможности, которые не поддерживаются реализацией.
5. Идём на пункт 2, делаем реализацию. И так «до победного конца».
Инструменты
• Mocha https://mochajs.org/ Общие функции (describe и it)
• Chai http://www.chaijs.com/ Функции для проверок (assert.*)
11
Запуск тестов
Pow
• при возведении 2 в 3ю степень результат 8 (Тест не пройден)
12
Начальная реализация function pow() {
return 8; // :-)
}
С точки зрения BDD, ошибка при проходящих тестах – вина спецификации.
13
Запуск тестов
Pow
• при возведении 2 в 3ю степень результат 8 (Тест пройден)
Расширение спецификации
Добавить assert it("возводит в n-ю степень", function() {
assert.equal(pow(2, 3), 8);
assert.equal(pow(3, 4), 81);
});
Сделать два теста it("возводит 2 в 3ю степень", function() {
assert.equal(pow(2, 3), 8);
});
it("возводит 3 в 4ю степень", function() {
assert.equal(pow(3, 4), 81);
});
14
15
Один тест = одна вещь.
• Если assert обнаруживает ошибку, то он тут же прекращает выполнение блока it.
• Поэтому в первом варианте, если вдруг первый assert «провалился», то про результат второго мы никогда не узнаем.
• По этим причинам второй вариант здесь предпочтительнее.
16
Запуск тестов
Pow
• при возведении 2 в 3ю степень результат 8 (Тест пройден)
• при возведении 3 в 4ю степень резльтат равен 81 (Тест не пройден)
17
Уточнение реализации function pow(x, n) {
var result = 1;
for (var i = 0; i < n; i++) {
result *= x;
}
return result;
}
18
Расширение спецификации describe("pow", function() {
function makeTest(x) {
var expected = x * x * x;
it("при возведении " + x + " в степень
3 результат: " + expected, function() {
assert.equal(pow(x, 3), expected);
});
}
for (var x = 1; x <= 5; x++) {
makeTest(x);
}
});
19
Запуск тестов Pow
• при возведении 1 в степень 3 результат: 1 (Тест пройден)
• при возведении 2 в степень 3 результат: 8 (Тест пройден)
• при возведении 3 в степень 3 результат: 27 (Тест пройден)
• при возведении 4 в степень 3 результат: 64 (Тест пройден)
• при возведении 5 в степень 3 результат: 125 (Тест пройден)
ASSERT http://www.chaijs.com/api/assert/
21
Основные assert проверки
• assert(value) – value является true в логическом контексте.
• assert.equal(value1, value2) – равенство value1 == value2.
• assert.strictEqual(value1, value2) – строгое равенство value1 === value2.
• assert.notEqual, assert.notStrictEqual – проверки, обратные двум предыдущим.
• assert.isTrue(value) – value === true • assert.isFalse(value) – value === false
22
Should проверки
var user = {
name: 'Alexandr',
pets: [‘tuzik',‘murzik','bandit']
};
user.should.have.
property('name', 'Alexandr'); user.should.have.
property('pets').with.lengthOf(3);
23
Expect проверки
var user = {
name: 'Alexandr',
pets: [‘tuzik',‘murzik','bandit']
};
expect(user).to.have.
property('name', 'Alexandr'); expect(user).to.have.
property('pets').to.have.length(3);
24
Expect проверки
expect(foo).to.be.a('string') expect(foo).to.equal('bar')