Автоматическое тестирование в JavaScript JS Testing.pdf ·...

Preview:

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')

Recommended