Вопросы?

Вопросы

Занятие 8

Тестирование

Цели (c точки зрения разработчика):

  • Проверка соответствия ожиданиям
  • Проверка состояния системы (регрессия)
  • Документирование кода
  • Примеры использования
  • Поиск / проверка на ошибки

Вопросы?

Уровни тестирования

  • Модульное ( функция / класс )
  • Интеграционное (межмодульное)
  • UI ( системное )

Пирамида тестирования

Пирамида тестирования

Вопросы?

По объекту тестирования

  • Функционал
  • Кроссбраузерность
  • Нагрузочное тестирование
  • Стресс тестирование
  • Юзабилити
  • Безопасность *

Вопросы?

Относительно выполнения кода:

  • Без выполнения кода
  • С частичным выполнением кода
  • С выполнением кода

Тестирование без выполнения - статический анализ

Ручное тестирование

Важно! Иметь сценарии использования, чтобы тестировать методически.

Хаотичное тестирование - метод свободного поиска.

Автоматизированное тестирование

По уровню:

  • Модуль
  • Взаимодествие компонентов
  • Интеграционное тестирование
  • Системное

Общий подход: Выполнить код и проверить результат его работы

Вопросы?

Модульное тестирование

Особенности:
  • Тестирует реализацию
  • Скорость работы и точность выявления ошибок
  • "Белый" ящик
  • Влияют на устройство кода "внутри"

describe('Array', function() {
  describe('#indexOf()', function() {
    it('should return -1 when the value is not present', function() {
      [1,2,3].indexOf(5).should.equal(-1);
      [1,2,3].indexOf(0).should.equal(-1);
    });
  });
});
            
Success tests
Failed tests

describe('Connection', function() {
  var db = new Connection,
    tobi = new User('tobi');

  beforeEach(function(done) {
    db.clear((err) => {
      return (err) ? done(err): db.save([tobi, loki, jane], done);
    });
  });

  describe('#find()', () => {
    it('respond with matching records', (done) => {
      db.find({type: 'User'}, (err, res) => {
        if (err) return done(err);
        res.should.have.length(3);
        done();
      });
    });
  });
});
            

Вопросы?

Почему его не достаточно?

No integration tests
No integration tests
No integration tests
No integration tests

Вспомогательные объекты/методы

test stub (заглушка), используется для получения данных из внешней зависимости, подменяя её.

test spy (тестовый шпион), используется для тестов взаимодействия, основной функцией является запись данных и вызовов, поступающих из тестируемого объекта для последующей проверки

mock object (мок-объект), очень похож на тестовый шпион, однако не записывает последовательность вызовов с переданными параметрами для последующей проверки

Вопросы?

UI тестирование

Особенности:
  • Тестирует функционал, а не код
  • Сценарии со стороны пользователя
  • Кроссбраузерность
  • Нет привязки к средствам реализации
  • "Черный" ящик
  • "Простое" создание тестов
  • Медленные *
Selenium tests

var webdriverio = require('webdriverio');
var options = { desiredCapabilities: { browserName: 'chrome' } };
var client = webdriverio.remote(options);
client
    .init()
    .url('https://duckduckgo.com/')
    .setValue('#search_form_input_homepage', 'WebdriverIO')
    .click('#search_button_homepage')
    .getTitle().then(function(title) {
        console.log('Title is: ' + title);
        // outputs:
        // "Title is: WebdriverIO (Software) at DuckDuckGo"
    })
    .end();
            
Разбор примера тестов

Вопросы?