Skip to content

Commit fc25d2a

Browse files
committed
feat(1-02-01-hello-world): Fix language mistakes in 05-testing-mocha
1 parent a16c04c commit fc25d2a

File tree

2 files changed

+21
-21
lines changed

2 files changed

+21
-21
lines changed

1-js/03-code-quality/05-testing-mocha/3-pow-test-wrong/solution.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
Тест демонструє одну із спокус, з якою стикається розробник, коли пише тести.
1+
Тест демонструє одну зі спокус, з якою стикається розробник, коли пише тести.
22

33
Що ми маємо тут, це насправді 3 тести, але вони були описані однією функцією з 3 припущеннями.
44

1-js/03-code-quality/05-testing-mocha/article.md

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,11 @@
1818

1919
Це дуже типово. Коли ми щось розробляємо, ми пам’ятаємо про багато можливих випадків використання. Але не треба очікувати, що програміст перевірятиме їх усі вручну після кожної зміни. Так стає легко виправити щось одне і зламати інше.
2020

21-
**Автоматизоване тестування означає, що тести пишуться окремо від основного коду, доповнюючи його. Вони запускають наші функції різними способами і порівнюють результати з очікуваними.**
21+
**Автоматизоване тестування означає, що тести пишуться окремо від основного коду, доповнюючи його. Вони запускають наші функції різними способами та порівнюють результати з очікуваними.**
2222

2323
## Керована поведінкою розробка (BDD)
2424

25-
Давайте розпочнемо з техніки під назвою [Керована поведінкою розробка](https://uk.wikipedia.org/wiki/Керована_поведінкою_розробка) або коротко, BDD (від англ. behavior-driven development).
25+
Розпочнімо з техніки під назвою [Керована поведінкою розробка](https://uk.wikipedia.org/wiki/Керована_поведінкою_розробка) або коротко, BDD (від англ. behavior-driven development).
2626

2727
**BDD це три в одному: і тести, і документація, і приклади використання.**
2828

@@ -32,7 +32,7 @@
3232

3333
Припустимо, ми хочемо зробити функцію `pow(x, n)`, яка піднесе `x` до степеня `n`. Ми припускаємо, що `n≥0`.
3434

35-
Це завдання є просто прикладом - в JavaScript є оператор `**`, що підносить до степеня, але в цьому прикладі ми зосередимось на процесі розробки, який потім можна також застосовувати і для більш складних завдань.
35+
Це завдання є просто прикладом - в JavaScript є оператор `**`, що підносить до степеня, але в цьому прикладі ми зосередимось на процесі розробки, який потім можна також застосовувати й для складніших завдань.
3636

3737
Перш ніж створити код для функції `pow ', ми можемо уявити, що вона повинна виконувати, і описати її.
3838

@@ -57,11 +57,11 @@ describe("pow", function() {
5757
: У першому аргументі (назві) `it` ми описуємо *людською мовою* конкретний спосіб використання функції, а у другому аргументі пишемо функцію, яка тестуватиме цей спосіб.
5858

5959
`assert.equal(value1, value2)`
60-
: Код, всереді блоку `it`, якщо реалізація правильна, повинен виконуватись без помилок.
60+
: Код, всередині блоку `it`, якщо реалізація правильна, повинен виконуватись без помилок.
6161

6262
Функції `assert.*` використовуються для перевірки того, що функція `pow` працює, як ми очікуємо. В нашому випадку, ми використовуємо одну з них -- `assert.equal`, вона порівнює аргументи і сповіщає про помилку, якщо вони відрізняються. Тут вона перевіряє, що результат `pow(2, 3)` дорівнює `8`. Є також інші способи порівняння та перевірки, які ми розглянемо пізніше.
6363

64-
Специфікацію можна виконати, і вона у свою чергу виконає тести вказані у блоках `it`. Ми розглянемо це далі.
64+
Специфікацію можна виконати, і вона автоматично виконає тести вказані у блоках `it`. Ми розглянемо це далі.
6565

6666
## Процес розробки
6767

@@ -71,15 +71,15 @@ describe("pow", function() {
7171
2. Створюється початкова реалізація.
7272
3. Щоб перевірити, чи вона працює, ми використовуємо тестовий фреймворк [Mocha](https://mochajs.org/) (більш детально нижче), який виконує специфікацію. Якщо функціонал не завершено -- виводяться повідомлення про помилки. Ми робимо виправлення до тих пір, поки не матимемо повністю робочий код.
7373
4. Тепер ми маємо початкову реалізацію з тестами.
74-
5. Ми додаємо більше способів використання до специфікації, навіть таких, що поки що не підтримуються реалізацією. Виконання тестів знову завершиться невдачою.
74+
5. Ми додаємо більше способів використання до специфікації, навіть таких, що поки що не підтримуються реалізацією. Виконання тестів знову завершиться невдачею.
7575
6. Переходимо на 3-й пункт, змінюємо реалізацію, щоб вона відповідала тестам і вони не повертали повідомлення про помилку.
7676
7. Повторюємо процес, описаний у пунктах з 3-го по 6-ий, поки функціонал не буде повністю готовий.
7777

7878
Тобто, процес розробки є *ітеративним*. Ми пишемо специфікацію, реалізуємо її, переконуємось, що тести проходять, потім пишемо ще тести, переконуємось, що вони також проходять і т.д. Завершивши цей процес, ми маємо реалізований робочий функціонал і тести до нього.
7979

80-
Давайте розглянемо цей процес розробки на нашому прикладі.
80+
Розгляньмо цей процес розробки на нашому прикладі.
8181

82-
Перший пункт вже виконано -- ми маємо первинну специфікацію для функції `pow`. Тепер, перед початком написання коду, давайте використаємо декілька бібліотек JavaScript для запуску тестів, щоб перевірити, що вони працюють (звичайно, без коду функції, вони всі завершаться невдачою).
82+
Перший пункт вже виконано -- ми маємо первинну специфікацію для функції `pow`. Тепер, перед початком написання коду, використаймо декілька бібліотек JavaScript для запуску тестів, щоб перевірити, що вони працюють (звичайно, без коду функції, вони всі завершаться невдачею).
8383

8484
## Специфікація в дії
8585

@@ -108,13 +108,13 @@ describe("pow", function() {
108108

109109
[iframe height=250 src="pow-1" border=1 edit]
110110

111-
Поки що тест провалюється, є помилка. Це логічно - код функції `pow` пустий, тобто `pow(2,3)` поверає `undefined` замість `8`.
111+
Поки що тест провалюється, є помилка. Це логічно - код функції `pow` пустий, тобто `pow(2,3)` повертає `undefined` замість `8`.
112112

113113
На майбутнє зазначимо, що є більш високорівневі засоби для запуску тестів, наприклад [karma](https://karma-runner.github.io/) та інші, які полегшують автоматичний запуск різних тестів.
114114

115115
## Первинна реалізація
116116

117-
Давайте розробимо первинну реалізацію функції `pow`, щоб тести проходили:
117+
Розробімо первинну реалізацію функції `pow`, щоб тести проходили:
118118

119119
```js
120120
function pow(x, n) {
@@ -166,7 +166,7 @@ function pow(x, n) {
166166
});
167167
```
168168

169-
Принципова відмінність полягає в тому, що коли `assert` повертає помилку, блок `it` негайно припиняється. Отже, у першому варіанті, якщо перший `assert` не вдасться, ми ніколи не отримаємо результат другого` assert`.
169+
Принципова відмінність полягає в тому, що коли `assert` повертає помилку, блок `it` негайно припиняється. Отже, у першому варіанті, якщо перший `assert` не вдасться, ми ніколи не отримаємо результат другого `assert`.
170170

171171
Створення тестів окремо корисно, щоб отримати більше інформації про те, що відбувається, так що другий варіант краще.
172172

@@ -186,7 +186,7 @@ function pow(x, n) {
186186

187187
## Вдосконалення реалізації
188188

189-
Давайте напишемо щось більш реальне для проходження тестів:
189+
Напишімо щось більш реальне для проходження тестів:
190190

191191
```js
192192
function pow(x, n) {
@@ -200,7 +200,7 @@ function pow(x, n) {
200200
}
201201
```
202202

203-
Щоб переконатися, що функція працює правильно, давайте перевіримо більше значень. Замість того, щоб писати блоки `it` вручну, ми можемо генерувати їх в циклі `for`:
203+
Щоб переконатися, що функція працює правильно, перевірмо більше значень. Замість того, щоб писати блоки `it` вручну, ми можемо генерувати їх в циклі `for`:
204204

205205
```js
206206
describe("pow", function() {
@@ -225,7 +225,7 @@ describe("pow", function() {
225225

226226
## Вкладені інструкції "describe"
227227

228-
Ми додамо ще більше тестів. Але перед цим зазначимо, що дпоміжна функція `makeTest` та цикл `for` повинні бути згруповані разом. Нам не знадобиться `makeTest` в інших тестах - вона потрібна лише для циклу `for` - їх спільне завдання перевіряти `pow`, звівши число до заданого степеня.
228+
Ми додамо ще більше тестів. Але перед цим зазначимо, що допоміжна функція `makeTest` та цикл `for` повинні бути згруповані разом. Нам не знадобиться `makeTest` в інших тестах - вона потрібна лише для циклу `for` - їх спільне завдання перевіряти `pow`, звівши число до заданого степеня.
229229

230230
Групування проводиться за допомогою вкладеної інструкції `describe`:
231231

@@ -296,12 +296,12 @@ describe("test", function() {
296296
297297
[edit src="beforeafter" title="Відкрити приклад в пісочниці."]
298298
299-
Як правило, `beforeEach/afterEach` і `before/after` використовуються для виконання ініціалізації, обнулення лічильників або ще для чогось між тестами (або групами тестів).
299+
Як правило, `beforeEach/afterEach` і `before/after` використовуються для виконання ініціалізації, скидання лічильників або ще для чогось між тестами (або групами тестів).
300300
````
301301
302302
## Розширення специфікації
303303
304-
Основна функціональність `pow` завершена. Перша ітерація розробки завершена. Відсвяткувавши та випивши шампанське, давайте продовжемо вдосконалювати її.
304+
Основна функціональність `pow` завершена. Перша ітерація розробки завершена. Відсвяткувавши та випивши шампанське, продовжмо вдосконалювати її.
305305
306306
Як було сказано, функція `pow(x, n)` має працювати з додатними цілими значеннями `n`.
307307
@@ -387,23 +387,23 @@ function pow(x, n) {
387387

388388
Це особливо важливо для великих проєктів, коли функція використовується в багатьох місцях. Коли ми змінюємо таку функцію, просто неможливо вручну перевірити, чи кожне місце, яке її використовує, все ще працює правильно.
389389

390-
Без тестів люди мають два варіанта:
390+
Без тестів люди мають два варіанти:
391391

392392
1. Здійснити зміну, незважаючи ні на що. І тоді наші користувачі зустрічаються з помилками, оскільки ми, мабуть, не перевірили щось вручну.
393393
2. Або, якщо покарання за помилки суворе, оскільки немає тестів, люди бояться змінювати такі функції, і тоді код застаріває, ніхто не хоче його правити. Це не добре для розробки.
394394

395395
**Автоматичне тестування допомагає уникнути цих проблем!**
396396

397-
Якщо проєкт покритий тестами, такої проблеми просто немає. Після будь-яких змін ми можемо запустити тести і побачити безліч перевірок, зроблених за лічені секунди.
397+
Якщо проєкт покритий тестами, такої проблеми просто немає. Після будь-яких змін ми можемо запустити тести й побачити безліч перевірок, зроблених за лічені секунди.
398398

399399
**Крім того, добре перевірений код має кращу архітектуру.**
400400

401401
Звісно, це тому, що автоматично перевірений код легше змінювати та вдосконалювати. Але є й інша причина.
402402

403403
Для написання тестів код повинен бути організований таким чином, щоб кожна функція мала чітко описане завдання, чітко визначені вхідні дані та вихідний результат. Це означає хорошу архітектуру з самого початку.
404404

405-
У реальному житті це часом не так просто. Іноді складно написати специфікацію перед фактичним кодом, тому що ще не зрозуміло, як вона повинна вести себе. Але в цілому написання тестів робить розробку швидшою і стабільнішою.
405+
У реальному житті це часом не так просто. Іноді складно написати специфікацію перед фактичним кодом, тому що ще не зрозуміло, як він повинен поводитись. Але в цілому написання тестів робить розробку швидшою і стабільнішою.
406406

407407
Пізніше в підручнику ви зустрінете багато завдань з тестами. Тож ви побачите більше практичних прикладів.
408408

409-
Написання тестів вимагає хороших знань JavaScript. Але ми тільки починаємо це вивчати. Отже, не хвилюйтесь, поки що вам не потрібно писати тести, але ви вже маєте можливість їх прочитати, навіть якщо вони будут трохи складніші, ніж ті, що навдені у цій главі.
409+
Написання тестів вимагає хороших знань JavaScript. Але ми тільки починаємо це вивчати. Отже, не хвилюйтесь, поки що вам не потрібно писати тести, але ви вже маєте можливість їх прочитати, навіть якщо вони будуть трохи складніші, ніж ті, що наведені у цій главі.

0 commit comments

Comments
 (0)