Upgrade to Pro — share decks privately, control downloads, hide ads and more …

2.Solodkiy_unit-tests.pdf

 2.Solodkiy_unit-tests.pdf

Badoo Tech

March 16, 2019
Tweet

More Decks by Badoo Tech

Other Decks in Programming

Transcript

  1. 2) Тесты повышают удобство разработки • ускорение обратной связи •

    упрощение рефакторинга • тесты — это документация
  2. 3) Тесты организуют ваш код • делают ваш код контрактным

    • тесты заставляют вас думать о граничных условиях
  3. • стабильный • падает на багах • устойчивый к рефакторингу

    • быстрый • не зависит от окружения • понятный
  4. • нестабильный • проходит на багах • ломкий • медленный

    • работает только в определённом окружении • сложный
  5. В контракт функции может входить: • диапазон входных параметров (предусловия)

    • ожидаемый результат (постусловия) • условия возникновения исключений • результат на граничных условиях
  6. Функция называется детерминированной, 
 когда для одного и того же

    набора входных значений она возвращает одинаковый результат.
  7. Побочный эффект — любое взаимодействие с окружением (чтение и запись

    файлов, глобальных переменных, любая работа с сетью)
  8. Чистая функция всегда однозначно преобразует входные параметры в выходные, никак

    при этом не взаимодействуя с окружением Input Output
 [2, 4, 5] => array_sum => 11
  9. Процедура Чистая функция Не детерминирована 
 или есть побочный эффект

    Примеры:
 rand() date() file_get_contents() PDO::query() Детерминированность
 Отсутствие побочных эффектов Примеры: abs() array_sum() count()
  10. Если ваш unit-тест будет чистой функцией, то он будет: •

    быстрым • стабильным • не зависимым от окружения
  11. Function testAbs($number, $expected_result) {
 $actual_result = abs($number)
 $this->assertEquals($expected_result, $actual_result);
 }

    Function absProvider() {
 return [
 [1, 1],
 [-5, 5],
 [5, 5]
 ];
 } Тестирование чистых функций
  12. Function testAbs($number, $expected_result) {
 $actual_result = abs($number)
 $this->assertEquals($expected_result, $actual_result);
 }

    Function absProvider() {
 return [
 [1, 1],
 [-5, 5],
 [5, 5]
 ];
 } Тестирование чистых функций
  13. Function testAbs($number, $expected_result) {
 $actual_result = abs($number)
 $this->assertEquals($expected_result, $actual_result);
 }

    Function absProvider() {
 return [
 [1, 1],
 [-5, 5],
 [5, 5]
 ];
 } Тестирование чистых функций
  14. Function testAbs($number, $expected_result) {
 $actual_result = abs($number)
 $this->assertEquals($expected_result, $actual_result);
 }

    Function absProvider() {
 return [
 [1, 1],
 [-5, 5],
 [5, 5]
 ];
 } Тестирование чистых функций
  15. Function testAbs($number, $expected_result) {
 $actual_result = abs($number)
 $this->assertEquals($expected_result, $actual_result);
 }

    Function absProvider() {
 return [
 [1, 1],
 [-5, 5],
 [5, 5]
 ];
 } Тестирование чистых функций
  16. Контракт usersManager::userRegister: 1) При успешной регистрации пользователь будет добавлен в

    таблицу, и ему на почту будет отправлен сгенерированный пароль 2) Метод возвращает id пользователя в базе 3) Страна пользователя определяется по доменной зоне email 4) Если такой пользователь уже есть а базе — кидаем DuplicateUserException
  17. Function testAbs($number, $expected_result) {
 $actual_result = abs($number)
 $this->assertEquals($expected_result, $actual_result);
 }

    Function absProvider() {
 return [
 [1, 1],
 [-5, 5],
 [5, 5]
 ];
 } Тестирование чистых функций Входы
  18. Function testAbs($number, $expected_result) {
 $actual_result = abs($number)
 $this->assertEquals($expected_result, $actual_result);
 }

    Function absProvider() {
 return [
 [1, 1],
 [-5, 5],
 [5, 5]
 ];
 } Тестирование чистых функций
  19. Function testAbs($number, $expected_result) {
 $actual_result = abs($number)
 $this->assertEquals($expected_result, $actual_result);
 }

    Function absProvider() {
 return [
 [1, 1],
 [-5, 5],
 [5, 5]
 ];
 } Тестирование чистых функций Выходы
  20. Function testAbs($number, $expected_result) {
 $actual_result = abs($number)
 $this->assertEquals($expected_result, $actual_result);
 }

    Function absProvider() {
 return [
 [1, 1],
 [-5, 5],
 [5, 5]
 ];
 } Тестирование чистых функций
  21. Function testAbs($number, $expected_result) {
 $actual_result = abs($number)
 $this->assertEquals($expected_result, $actual_result);
 }

    Function absProvider() {
 return [
 [1, 1],
 [-5, 5],
 [5, 5]
 ];
 } Тестирование чистых функций
  22. Function testAbs($number, $expected_result) {
 $actual_result = abs($number)
 $this->assertEquals($expected_result, $actual_result);
 }

    Function absProvider() {
 return [
 [1, 1],
 [-5, 5],
 [5, 5]
 ];
 } Тестирование чистых функций
  23. Function testAbs($number, $expected_result) {
 $actual_result = abs($number)
 $this->assertEquals($expected_result, $actual_result);
 }

    Function absProvider() {
 return [
 [1, 1],
 [-5, 5],
 [5, 5]
 ];
 } Тестирование чистых функций
  24. Function testAbs($number, $expected_result) {
 $actual_result = abs($number)
 $this->assertEquals($expected_result, $actual_result);
 }

    Function absProvider() {
 return [
 [1, 1],
 [-5, 5],
 [5, 5]
 ];
 } Тестирование чистых функций
  25. Function testAbs($number, $expected_result) {
 $actual_result = abs($number)
 $this->assertEquals($expected_result, $actual_result);
 }

    Function absProvider() {
 return [
 [1, 1],
 [-5, 5],
 [5, 5]
 ];
 } Тестирование чистых функций
  26. Function testAbs($number, $expected_result) {
 $actual_result = abs($number)
 $this->assertEquals($expected_result, $actual_result);
 }

    Function absProvider() {
 return [
 [1, 1],
 [-5, 5],
 [5, 5]
 ];
 } Тестирование чистых функций
  27. Function testAbs($number, $expected_result) {
 $actual_result = abs($number)
 $this->assertEquals($expected_result, $actual_result);
 }

    Function absProvider() {
 return [
 [1, 1],
 [-5, 5],
 [5, 5]
 ];
 } Тестирование чистых функций
  28. Function testAbs($number, $expected_result) {
 $actual_result = abs($number)
 $this->assertEquals($expected_result, $actual_result);
 }

    Function absProvider() {
 return [
 [1, 1],
 [-5, 5],
 [5, 5]
 ];
 } Тестирование чистых функций
  29. Function testAbs($number, $expected_result) {
 $actual_result = abs($number)
 $this->assertEquals($expected_result, $actual_result);
 }

    Function absProvider() {
 return [
 [1, 1],
 [-5, 5],
 [5, 5]
 ];
 } Тестирование чистых функций
  30. Function testAbs($number, $expected_result) {
 $actual_result = abs($number)
 $this->assertEquals($expected_result, $actual_result);
 }

    Function absProvider() {
 return [
 [1, 1],
 [-5, 5],
 [5, 5]
 ];
 } Тестирование чистых функций
  31. Function testAbs($number, $expected_result) {
 $actual_result = abs($number)
 $this->assertEquals($expected_result, $actual_result);
 }

    Function absProvider() {
 return [
 [1, 1],
 [-5, 5],
 [5, 5]
 ];
 } Тестирование чистых функций
  32. Function testAbs($number, $expected_result) {
 $actual_result = abs($number)
 $this->assertEquals($expected_result, $actual_result);
 }

    Function absProvider() {
 return [
 [1, 1],
 [-5, 5],
 [5, 5]
 ];
 } Тестирование чистых функций
  33. Function testAbs($number, $expected_result) {
 $actual_result = abs($number)
 $this->assertEquals($expected_result, $actual_result);
 }

    Function absProvider() {
 return [
 [1, 1],
 [-5, 5],
 [5, 5]
 ];
 } Тестирование чистых функций
  34. Function testAbs($number, $expected_result) {
 $actual_result = abs($number)
 $this->assertEquals($expected_result, $actual_result);
 }

    Function absProvider() {
 return [
 [1, 1],
 [-5, 5],
 [5, 5]
 ];
 } Тестирование чистых функций
  35. Function testAbs($number, $expected_result) {
 $actual_result = abs($number)
 $this->assertEquals($expected_result, $actual_result);
 }

    Function absProvider() {
 return [
 [1, 1],
 [-5, 5],
 [5, 5]
 ];
 } Тестирование чистых функций
  36. Function testAbs($number, $expected_result) {
 $actual_result = abs($number)
 $this->assertEquals($expected_result, $actual_result);
 }

    Function absProvider() {
 return [
 [1, 1],
 [-5, 5],
 [5, 5]
 ];
 } Тестирование чистых функций
  37. Function testAbs($number, $expected_result) {
 $actual_result = abs($number)
 $this->assertEquals($expected_result, $actual_result);
 }

    Function absProvider() {
 return [
 [1, 1],
 [-5, 5],
 [5, 5]
 ];
 } Тестирование чистых функций
  38. Function testAbs($number, $expected_result) {
 $actual_result = abs($number)
 $this->assertEquals($expected_result, $actual_result);
 }

    Function absProvider() {
 return [
 [1, 1],
 [-5, 5],
 [5, 5]
 ];
 } Тестирование чистых функций
  39. Function testAbs($number, $expected_result) {
 $actual_result = abs($number)
 $this->assertEquals($expected_result, $actual_result);
 }

    Function absProvider() {
 return [
 [1, 1],
 [-5, 5],
 [5, 5]
 ];
 } Тестирование чистых функций
  40. Function testAbs($number, $expected_result) {
 $actual_result = abs($number)
 $this->assertEquals($expected_result, $actual_result);
 }

    Function absProvider() {
 return [
 [1, 1],
 [-5, 5],
 [5, 5]
 ];
 } Тестирование чистых функций
  41. Function testAbs($number, $expected_result) {
 $actual_result = abs($number)
 $this->assertEquals($expected_result, $actual_result);
 }

    Function absProvider() {
 return [
 [1, 1],
 [-5, 5],
 [5, 5]
 ];
 } Тестирование чистых функций
  42. Function testAbs($number, $expected_result) {
 $actual_result = abs($number)
 $this->assertEquals($expected_result, $actual_result);
 }

    Function absProvider() {
 return [
 [1, 1],
 [-5, 5],
 [5, 5]
 ];
 } Тестирование чистых функций
  43. Function testAbs($number, $expected_result) {
 $actual_result = abs($number)
 $this->assertEquals($expected_result, $actual_result);
 }

    Function absProvider() {
 return [
 [1, 1],
 [-5, 5],
 [5, 5]
 ];
 } Тестирование чистых функций
  44. Function testAbs($number, $expected_result) {
 $actual_result = abs($number)
 $this->assertEquals($expected_result, $actual_result);
 }

    Function absProvider() {
 return [
 [1, 1],
 [-5, 5],
 [5, 5]
 ];
 } Тестирование чистых функций
  45. Function testAbs($number, $expected_result) {
 $actual_result = abs($number)
 $this->assertEquals($expected_result, $actual_result);
 }

    Function absProvider() {
 return [
 [1, 1],
 [-5, 5],
 [5, 5]
 ];
 } Тестирование чистых функций
  46. • плохие тесты хуже, чем их отсутствие • unit-тесты —

    это инструмент проверки контрактов • код должен быть контрактным, если вы хотите тестировать его unit-тестами • тестируйте контракт, а не реализацию • unit-тесты подходят только для чистых функций
  47. Alexey Solodkiy email: [email protected] tg: @solodkiy CHEERS! [work@MacBook-Pro-Alexey ~/examples]# ./vendor/bin/phpunit

    tests/UsersManagerTest.php PHPUnit 7.5.6 by Sebastian Bergmann and contributors. ..... 5 / 5 (100%) Time: 88 ms, Memory: 4.00 MB OK (5 tests, 5 assertions)