2. Типова ситуація
%username% “запілив нову фічу”
...через n-хвилин
Відпала авторизація, окремі розділи на
сайті викидають 500 помилки, тощо..
Погляд відповідального
за проект розробника
3. Вихід з ситуації
1. Запустив тести
2. Відшукав помилку
3. Виправив помилку
4. В продакшн
(2...15 хв)
Погляд відповідального
за проект девелопера
4. Тестування - це перевірка
відповідності між реальним
і очікуваним результатом
роботи програмного
забезпечення.
“Програми, які не тестували, не працюють!”
Б. Страуструп
5. Види тестувань
1. Блочне або модульне (unit)
2. Інтеграційне (взаємодія декількох модулів/юнітів)
3. Системне (тестується вся система в цілому)
6. Цілі
1. Підвищення якості вихідного продукту
2. Швидкий пошук помилок та їх виправлення
3. Зручний спосіб “безболісного” коригування уже готового
функціоналу
7. Коли пишуть тести
1. До написання п.з (TDD або test-driven development)
2. Після або під час розробки
8. Міфи
1. Тестування занадто дороге, займає багато часу
2. Тестуються тільки готові продукти
3. Можливість протестити всю програму відразу
4. Тестувальники відповідають за якість продукту
5. Єдина задача - пошук помилок
9. Якості хороших тестів
1. Тести повинні бути повністю автоматизовані
2. Тести повинні бути самостійні, незалежні від інших
3. Тестуватись має все, що може “відпасти”
4. Тести повинні запускатись декілька раз, але повертати один і
той же результат
10. Як виправляти баги
1. Знайти баг
2. Написати тест який відпаде
3. Виправити код, так щоб тест завершився успішно
4. Запустити інші тести
11. Переваги
1. Виявлення проблем ще на стадії розробки
2. Значно зменшують час на пошук помилок
3. Регресійне тестування
4. Формують краще стуктуру п.з.
5. Чим більше тестів - тим менше проблем (~1:1)
6. Тести часто використовують як документацію
12. Недоліки
1. Практично неможливо покрити весь функціонал
2. Важко застососувати на “динамічному” функціоналі
3. Працезатратно
13. The PHP Unit Testing framework
Sebastian Bergmann
Github: sebastianbergmann/phpunit
Off.site: https://phpunit.de/
Stars: 5.2k
Commits: 6,958
Releases: 388
14. Приклад #1
class IndexTest extends PHPUnit_Framework_TestCase {
public function testCallMainPage()
{
$response = $this->client->request("GET", $this->base_url . "/search?term=bar");
$this->assertEquals($response->getHeaderLine("Content-Type"), "application/json");
$this->assertEquals($response->getStatusCode(), 200, 'HTTP_OK');
$json = json_decode($response->getBody()->getContents(), 1);
$this->assertCount(1, $json['items'], "Count: 1");
$this->assertArraySubset(['items', 'term', 'count'], array_keys($json));
}
}
15. Приклад #2
#class IndexTest extends PHPUnit_Framework_TestCase {
public function testCallMainPage()
{
$response_get = $this->client->request("GET", $this->base_url);
$response_post = $this->client->request("POST", $this->base_url);
$response_delete = $this->client->request("DELETE", $this->base_url);
$this->assertEquals($response_get->getStatusCode(), 200, 'HTTP_OK');
$this->assertEquals($response_post->getStatusCode(), 200, 'HTTP_OK');
$this->assertEquals($response_delete->getStatusCode(), 405, 'Method not Allowed');
}
}
16. Приклад #3
public function mainPageData()
{
return [
['GET', 200, "HTTP_OK"],
['POST', 200, "HTTP_OK"],
['DELETE', 405, "Method_Not_Allowed"],
];
}
/**
* @dataProvider mainPageData
* @param $method - Http Method
* @param $status_code - Status code
* @param $message - Message for debugging
*/
public function testCallMainPage($method, $status_code, $message)
{
$response = $this->client->request($method, $this->base_url);
$this->assertEquals($response->getStatusCode(), $status_code,
$message);
}
19. Підсумок
1. Тестувати все що може зламатись
2. Код тестів, має бути приблизно близький по величині коду
программи
3. Краще виділити час на написання тестів, ніж час2
на пошуки
багів
4. Уміти писати самостійні тести, які не залежать від інших