SlideShare a Scribd company logo
1 of 19
Download to read offline
Тестування при
розробці п.з.
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

Viewers also liked

Ejercicios propuestos en excel
Ejercicios propuestos en excelEjercicios propuestos en excel
Ejercicios propuestos en excelKathleen Asprilla
 
Digital marketing Introduction webinar
Digital marketing Introduction webinarDigital marketing Introduction webinar
Digital marketing Introduction webinarHusam Algaladi
 
Sample presentation aileen
Sample presentation aileenSample presentation aileen
Sample presentation aileenaileenbelangel
 
Difilcutades de aprendizaje
Difilcutades de aprendizajeDifilcutades de aprendizaje
Difilcutades de aprendizajeLeidy Esmeralda
 
FEOFILOV_ARTEM_74784_TexteTheseCR
FEOFILOV_ARTEM_74784_TexteTheseCRFEOFILOV_ARTEM_74784_TexteTheseCR
FEOFILOV_ARTEM_74784_TexteTheseCRArtem Feofilov
 
ОРГАНІЗАЦІЙНО-ЕКОНОМІЧНА ХАРАКТЕРИСТИКА ФРАНЧАЙЗИНГОВОЇ МОДЕЛІ БІЗНЕСУ
ОРГАНІЗАЦІЙНО-ЕКОНОМІЧНА ХАРАКТЕРИСТИКА ФРАНЧАЙЗИНГОВОЇ МОДЕЛІ БІЗНЕСУОРГАНІЗАЦІЙНО-ЕКОНОМІЧНА ХАРАКТЕРИСТИКА ФРАНЧАЙЗИНГОВОЇ МОДЕЛІ БІЗНЕСУ
ОРГАНІЗАЦІЙНО-ЕКОНОМІЧНА ХАРАКТЕРИСТИКА ФРАНЧАЙЗИНГОВОЇ МОДЕЛІ БІЗНЕСУAlex Grebeshkov
 
Text based questions and academic vocabulary
Text based questions and academic vocabularyText based questions and academic vocabulary
Text based questions and academic vocabularyMelissa
 
Acuerdo pedagogico electiva enfasis nivel tecnico
Acuerdo pedagogico electiva enfasis nivel tecnicoAcuerdo pedagogico electiva enfasis nivel tecnico
Acuerdo pedagogico electiva enfasis nivel tecnicoMaribel Gaviria Castiblanco
 
Fieldlab UPPS - Smart Industry event 20160204
Fieldlab UPPS - Smart Industry event 20160204Fieldlab UPPS - Smart Industry event 20160204
Fieldlab UPPS - Smart Industry event 20160204CLICKNL
 
Machine Learning with Ayasdi
Machine Learning with AyasdiMachine Learning with Ayasdi
Machine Learning with AyasdiAyasdi
 

Viewers also liked (17)

Ejercicios propuestos en excel
Ejercicios propuestos en excelEjercicios propuestos en excel
Ejercicios propuestos en excel
 
Digital marketing Introduction webinar
Digital marketing Introduction webinarDigital marketing Introduction webinar
Digital marketing Introduction webinar
 
Sample presentation aileen
Sample presentation aileenSample presentation aileen
Sample presentation aileen
 
My led media facade introduction
My led media facade introductionMy led media facade introduction
My led media facade introduction
 
Fa & a cover (low res)
Fa & a cover (low res)Fa & a cover (low res)
Fa & a cover (low res)
 
Informe de desarrollo h umano 2010
Informe de desarrollo h umano 2010Informe de desarrollo h umano 2010
Informe de desarrollo h umano 2010
 
ASPEN
ASPENASPEN
ASPEN
 
Sonic Surf
Sonic SurfSonic Surf
Sonic Surf
 
Pnfp encuentro 2
Pnfp encuentro 2Pnfp encuentro 2
Pnfp encuentro 2
 
Difilcutades de aprendizaje
Difilcutades de aprendizajeDifilcutades de aprendizaje
Difilcutades de aprendizaje
 
FEOFILOV_ARTEM_74784_TexteTheseCR
FEOFILOV_ARTEM_74784_TexteTheseCRFEOFILOV_ARTEM_74784_TexteTheseCR
FEOFILOV_ARTEM_74784_TexteTheseCR
 
ОРГАНІЗАЦІЙНО-ЕКОНОМІЧНА ХАРАКТЕРИСТИКА ФРАНЧАЙЗИНГОВОЇ МОДЕЛІ БІЗНЕСУ
ОРГАНІЗАЦІЙНО-ЕКОНОМІЧНА ХАРАКТЕРИСТИКА ФРАНЧАЙЗИНГОВОЇ МОДЕЛІ БІЗНЕСУОРГАНІЗАЦІЙНО-ЕКОНОМІЧНА ХАРАКТЕРИСТИКА ФРАНЧАЙЗИНГОВОЇ МОДЕЛІ БІЗНЕСУ
ОРГАНІЗАЦІЙНО-ЕКОНОМІЧНА ХАРАКТЕРИСТИКА ФРАНЧАЙЗИНГОВОЇ МОДЕЛІ БІЗНЕСУ
 
Text based questions and academic vocabulary
Text based questions and academic vocabularyText based questions and academic vocabulary
Text based questions and academic vocabulary
 
Acuerdo pedagogico electiva enfasis nivel tecnico
Acuerdo pedagogico electiva enfasis nivel tecnicoAcuerdo pedagogico electiva enfasis nivel tecnico
Acuerdo pedagogico electiva enfasis nivel tecnico
 
Fieldlab UPPS - Smart Industry event 20160204
Fieldlab UPPS - Smart Industry event 20160204Fieldlab UPPS - Smart Industry event 20160204
Fieldlab UPPS - Smart Industry event 20160204
 
Machine Learning with Ayasdi
Machine Learning with AyasdiMachine Learning with Ayasdi
Machine Learning with Ayasdi
 
Cataleg d'activitats amb establiments VxL
Cataleg d'activitats amb establiments VxLCataleg d'activitats amb establiments VxL
Cataleg d'activitats amb establiments VxL
 

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

Php unit. Y. Muzychushun
Php unit. Y. MuzychushunPhp unit. Y. Muzychushun
Php unit. Y. MuzychushunHRdepartment
 
[Knowledge Sharing] - Unit Testing by Pavlo Serdyuk (UKR)
[Knowledge Sharing] - Unit Testing by Pavlo Serdyuk (UKR)[Knowledge Sharing] - Unit Testing by Pavlo Serdyuk (UKR)
[Knowledge Sharing] - Unit Testing by Pavlo Serdyuk (UKR)Exoft LLC
 
Структура тест-кейсу та звіту про помилки.pptx
Структура тест-кейсу та звіту про помилки.pptxСтруктура тест-кейсу та звіту про помилки.pptx
Структура тест-кейсу та звіту про помилки.pptxssuser40c4fa
 
МИХАЙЛО БОДНАРЧУК «Як перестати боятись та полюбити автотести на JavaScript» ...
МИХАЙЛО БОДНАРЧУК «Як перестати боятись та полюбити автотести на JavaScript» ...МИХАЙЛО БОДНАРЧУК «Як перестати боятись та полюбити автотести на JavaScript» ...
МИХАЙЛО БОДНАРЧУК «Як перестати боятись та полюбити автотести на JavaScript» ...GoQA
 
12 - gradle. evoliutsiia system avtomatychnoi zbirky - sviatoslav babych - it...
12 - gradle. evoliutsiia system avtomatychnoi zbirky - sviatoslav babych - it...12 - gradle. evoliutsiia system avtomatychnoi zbirky - sviatoslav babych - it...
12 - gradle. evoliutsiia system avtomatychnoi zbirky - sviatoslav babych - it...Igor Bronovskyy
 
Роман Писик - ISTQB Full Advanced: підготовка та застосування знань на практиці
Роман Писик - ISTQB Full Advanced: підготовка та застосування знань на практиціРоман Писик - ISTQB Full Advanced: підготовка та застосування знань на практиці
Роман Писик - ISTQB Full Advanced: підготовка та застосування знань на практиціGoQA
 
Code driven testing -- oleksandr pavlyshak
Code driven testing -- oleksandr pavlyshakCode driven testing -- oleksandr pavlyshak
Code driven testing -- oleksandr pavlyshakIgor Bronovskyy
 
QA Fest 2016. Яна Кокряшкіна. Паралельний запуск автоматизованих тестів за до...
QA Fest 2016. Яна Кокряшкіна. Паралельний запуск автоматизованих тестів за до...QA Fest 2016. Яна Кокряшкіна. Паралельний запуск автоматизованих тестів за до...
QA Fest 2016. Яна Кокряшкіна. Паралельний запуск автоматизованих тестів за до...QAFest
 
природна і економна дорожня карта для переходу команди розробки на тест центр...
природна і економна дорожня карта для переходу команди розробки на тест центр...природна і економна дорожня карта для переходу команди розробки на тест центр...
природна і економна дорожня карта для переходу команди розробки на тест центр...Andrii Podanenko
 
CoreCamp "Automated testing basics for developers"
CoreCamp "Automated testing basics for developers"CoreCamp "Automated testing basics for developers"
CoreCamp "Automated testing basics for developers"Bohdan Pashkovskyi
 
Anton Serputko Start performance-testing-from-scratch, BAQ
Anton Serputko Start performance-testing-from-scratch, BAQAnton Serputko Start performance-testing-from-scratch, BAQ
Anton Serputko Start performance-testing-from-scratch, BAQDakiry
 

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

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

Тестування при розробці програмного забезпечення. 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. Уміти писати самостійні тести, які не залежать від інших