SlideShare a Scribd company logo
Тестування при
розробці п.з.
Unit Tests
Sergiy Arendarchuk
Типова ситуація
%username% “запілив нову фічу”
...через n-хвилин
Відпала авторизація, окремі розділи на
сайті викидають 500 помилки, тощо..
Погляд відповідального
за проект розробника
Вихід з ситуації
1. Запустив тести
2. Відшукав помилку
3. Виправив помилку
4. В продакшн
(2...15 хв)
Погляд відповідального
за проект девелопера
Тестування - це перевірка
відповідності між реальним
і очікуваним результатом
роботи програмного
забезпечення.
“Програми, які не тестували, не працюють!”
Б. Страуструп
Види тестувань
1. Блочне або модульне (unit)
2. Інтеграційне (взаємодія декількох модулів/юнітів)
3. Системне (тестується вся система в цілому)
Цілі
1. Підвищення якості вихідного продукту
2. Швидкий пошук помилок та їх виправлення
3. Зручний спосіб “безболісного” коригування уже готового
функціоналу
Коли пишуть тести
1. До написання п.з (TDD або test-driven development)
2. Після або під час розробки
Міфи
1. Тестування занадто дороге, займає багато часу
2. Тестуються тільки готові продукти
3. Можливість протестити всю програму відразу
4. Тестувальники відповідають за якість продукту
5. Єдина задача - пошук помилок
Якості хороших тестів
1. Тести повинні бути повністю автоматизовані
2. Тести повинні бути самостійні, незалежні від інших
3. Тестуватись має все, що може “відпасти”
4. Тести повинні запускатись декілька раз, але повертати один і
той же результат
Як виправляти баги
1. Знайти баг
2. Написати тест який відпаде
3. Виправити код, так щоб тест завершився успішно
4. Запустити інші тести
Переваги
1. Виявлення проблем ще на стадії розробки
2. Значно зменшують час на пошук помилок
3. Регресійне тестування
4. Формують краще стуктуру п.з.
5. Чим більше тестів - тим менше проблем (~1:1)
6. Тести часто використовують як документацію
Недоліки
1. Практично неможливо покрити весь функціонал
2. Важко застососувати на “динамічному” функціоналі
3. Працезатратно
The PHP Unit Testing framework
Sebastian Bergmann
Github: sebastianbergmann/phpunit
Off.site: https://phpunit.de/
Stars: 5.2k
Commits: 6,958
Releases: 388
Приклад #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));
}
}
Приклад #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');
}
}
Приклад #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);
}
Приклад #5 (laravel 5.2+)
public function testSignUp()
{
$this->json("POST", route("auth_sign_up"), ['email' => $this->em, 'pass' => $this->pw, 'confirm' => $this->pwc])
->seeJson(['error' => false,'response' => 'Success registration'])
->seeJsonStructure(['error','response','token'])
->assertResponseOk(); // 200
$this->seeInDatabase("users", ['email' => $this->em]);
$this->json("POST", route("auth_sign_up"), ['email' => $this->em, 'pass' => $this->pw, 'confirm' => $this->pwc])
->seeJson(['error' => true])
->assertResponseOk(); // 200
}
Приклад #6 (laravel 5.2+)
public function testProfileAvatar()
{
$file = new UploadedFile(public_path($this->avatar), 'avatar.jpg', null, null, null, true);
$response = $this->call('POST', '/update_photo', ['token' => $this->token], [], ['photo' => $file]);
$this->assertResponseOk();
$image_uploaded_file = User::where("token", "user_token")->get(['avatar'])->first()->avatar;
$this->assertFileExists(public_path('uploads/avatars/' . $image_uploaded_file));
$this->seeInDatabase("users", ['avatar' => $image_uploaded_file]);
// Deleting Image from profile
$this->json("post", $this->baseUrl . '/delete_photo', ['token' => $this->token])
->seeJson(['error' => false]);
$this->notSeeInDatabase("users", ['avatar' => ['avatar' => $image_uploaded_file]]);
$this->assertFileNotExists(public_path('uploads/avatars/' . $image_uploaded_file));
}
Підсумок
1. Тестувати все що може зламатись
2. Код тестів, має бути приблизно близький по величині коду
программи
3. Краще виділити час на написання тестів, ніж час2
на пошуки
багів
4. Уміти писати самостійні тести, які не залежать від інших

More Related Content

ODP
Phpunit модульне тестування
PDF
07 - vysnovky z tdd, pohliad pochatkivtsia - vitalii zinchenko it event 2013...
PDF
Тестування з допомогою PHPUnit
PPTX
cpp-2013 #16 Automated testing
PPTX
QA Fest 2015. Ярослав Пернеровский. Мутанты наступают - смогут ли ваши тесты...
PDF
Xdebug (ukr)
PPTX
PDF
iPhone Objective-C Development (ukr) (2009)
Phpunit модульне тестування
07 - vysnovky z tdd, pohliad pochatkivtsia - vitalii zinchenko it event 2013...
Тестування з допомогою PHPUnit
cpp-2013 #16 Automated testing
QA Fest 2015. Ярослав Пернеровский. Мутанты наступают - смогут ли ваши тесты...
Xdebug (ukr)
iPhone Objective-C Development (ukr) (2009)

Viewers also liked (17)

PDF
Ejercicios propuestos en excel
PDF
Digital marketing Introduction webinar
PPTX
Sample presentation aileen
PDF
My led media facade introduction
PDF
Fa & a cover (low res)
PDF
PDF
Sonic Surf
PPT
Pnfp encuentro 2
PPTX
Difilcutades de aprendizaje
PDF
FEOFILOV_ARTEM_74784_TexteTheseCR
PPTX
ОРГАНІЗАЦІЙНО-ЕКОНОМІЧНА ХАРАКТЕРИСТИКА ФРАНЧАЙЗИНГОВОЇ МОДЕЛІ БІЗНЕСУ
PPTX
Text based questions and academic vocabulary
PDF
Acuerdo pedagogico electiva enfasis nivel tecnico
PPTX
Fieldlab UPPS - Smart Industry event 20160204
PPTX
Machine Learning with Ayasdi
PDF
Cataleg d'activitats amb establiments VxL
Ejercicios propuestos en excel
Digital marketing Introduction webinar
Sample presentation aileen
My led media facade introduction
Fa & a cover (low res)
Sonic Surf
Pnfp encuentro 2
Difilcutades de aprendizaje
FEOFILOV_ARTEM_74784_TexteTheseCR
ОРГАНІЗАЦІЙНО-ЕКОНОМІЧНА ХАРАКТЕРИСТИКА ФРАНЧАЙЗИНГОВОЇ МОДЕЛІ БІЗНЕСУ
Text based questions and academic vocabulary
Acuerdo pedagogico electiva enfasis nivel tecnico
Fieldlab UPPS - Smart Industry event 20160204
Machine Learning with Ayasdi
Cataleg d'activitats amb establiments VxL
Ad

Similar to Тестування при розробці програмного забезпечення. Unit Tests. (20)

PDF
Php unit. Y. Muzychushun
PPTX
Automated testing
PPTX
[Knowledge Sharing] - Unit Testing by Pavlo Serdyuk (UKR)
PPTX
Структура тест-кейсу та звіту про помилки.pptx
PDF
Tdd, ти де?
PDF
МИХАЙЛО БОДНАРЧУК «Як перестати боятись та полюбити автотести на JavaScript» ...
PPTX
Design patterns part 1
PPTX
PDF
12 - gradle. evoliutsiia system avtomatychnoi zbirky - sviatoslav babych - it...
PDF
Роман Писик - ISTQB Full Advanced: підготовка та застосування знань на практиці
PPTX
Code driven testing (UA)
PPT
JavaScript. Lectures. part 1. basis
PPTX
Clean code (UA)
PPTX
Code driven testing -- oleksandr pavlyshak
PPTX
Design patterns part 2
PPTX
QA Fest 2016. Яна Кокряшкіна. Паралельний запуск автоматизованих тестів за до...
PPTX
природна і економна дорожня карта для переходу команди розробки на тест центр...
PPTX
CoreCamp "Automated testing basics for developers"
PDF
Anton Serputko Start performance-testing-from-scratch, BAQ
Php unit. Y. Muzychushun
Automated testing
[Knowledge Sharing] - Unit Testing by Pavlo Serdyuk (UKR)
Структура тест-кейсу та звіту про помилки.pptx
Tdd, ти де?
МИХАЙЛО БОДНАРЧУК «Як перестати боятись та полюбити автотести на JavaScript» ...
Design patterns part 1
12 - gradle. evoliutsiia system avtomatychnoi zbirky - sviatoslav babych - it...
Роман Писик - ISTQB Full Advanced: підготовка та застосування знань на практиці
Code driven testing (UA)
JavaScript. Lectures. part 1. basis
Clean code (UA)
Code driven testing -- oleksandr pavlyshak
Design patterns part 2
QA Fest 2016. Яна Кокряшкіна. Паралельний запуск автоматизованих тестів за до...
природна і економна дорожня карта для переходу команди розробки на тест центр...
CoreCamp "Automated testing basics for developers"
Anton Serputko Start performance-testing-from-scratch, BAQ
Ad

Тестування при розробці програмного забезпечення. Unit Tests.

  • 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); }
  • 17. Приклад #5 (laravel 5.2+) public function testSignUp() { $this->json("POST", route("auth_sign_up"), ['email' => $this->em, 'pass' => $this->pw, 'confirm' => $this->pwc]) ->seeJson(['error' => false,'response' => 'Success registration']) ->seeJsonStructure(['error','response','token']) ->assertResponseOk(); // 200 $this->seeInDatabase("users", ['email' => $this->em]); $this->json("POST", route("auth_sign_up"), ['email' => $this->em, 'pass' => $this->pw, 'confirm' => $this->pwc]) ->seeJson(['error' => true]) ->assertResponseOk(); // 200 }
  • 18. Приклад #6 (laravel 5.2+) public function testProfileAvatar() { $file = new UploadedFile(public_path($this->avatar), 'avatar.jpg', null, null, null, true); $response = $this->call('POST', '/update_photo', ['token' => $this->token], [], ['photo' => $file]); $this->assertResponseOk(); $image_uploaded_file = User::where("token", "user_token")->get(['avatar'])->first()->avatar; $this->assertFileExists(public_path('uploads/avatars/' . $image_uploaded_file)); $this->seeInDatabase("users", ['avatar' => $image_uploaded_file]); // Deleting Image from profile $this->json("post", $this->baseUrl . '/delete_photo', ['token' => $this->token]) ->seeJson(['error' => false]); $this->notSeeInDatabase("users", ['avatar' => ['avatar' => $image_uploaded_file]]); $this->assertFileNotExists(public_path('uploads/avatars/' . $image_uploaded_file)); }
  • 19. Підсумок 1. Тестувати все що може зламатись 2. Код тестів, має бути приблизно близький по величині коду программи 3. Краще виділити час на написання тестів, ніж час2 на пошуки багів 4. Уміти писати самостійні тести, які не залежать від інших