Skip to content

Commit e7f4f42

Browse files
authored
Merge pull request iliakan#355 from mar-mar/patch-1
Откорректирована пунктуация.
2 parents 7848de8 + 27403f5 commit e7f4f42

File tree

1 file changed

+14
-14
lines changed

1 file changed

+14
-14
lines changed

1-js/3-writing-js/4-testing/article.md

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,17 @@
66

77
## Зачем нужны тесты?
88

9-
При написании функции мы обычно представляем, что она должна делать, какое значение -- на каких аргументах выдавать.
9+
При написании функции мы обычно представляем, что она должна делать, какое значение на каких аргументах выдавать.
1010

11-
В процессе разработки мы, время от времени, проверяем, правильно ли работает функция. Самый простой способ проверить -- это запустить её, например, в консоли, и посмотреть результат.
11+
В процессе разработки мы время от времени проверяем, правильно ли работает функция. Самый простой способ проверить -- это запустить её, например в консоли, и посмотреть результат.
1212

13-
Если что-то не так -- поправить, опять запустить -- посмотреть результат... И так -- "до победного конца".
13+
Если что-то не так, поправить, опять запустить -- посмотреть результат... И так "до победного конца".
1414

1515
Но такие ручные запуски -- очень несовершенное средство проверки.
1616

1717
**Когда проверяешь работу кода вручную -- легко его "недотестировать".**
1818

19-
Например, пишем функцию `f`. Написали, тестируем с разными аргументами. Вызов функции `f(a)` -- работает, а вот `f(b)` -- не работает. Поправили код -- стало работать `f(b)`, вроде закончили. Но при этом забыли заново протестировать `f(a)` -- упс, вот и возможная ошибка в коде.
19+
Например, пишем функцию `f`. Написали, тестируем с разными аргументами. Вызов функции `f(a)` работает, а вот `f(b)` не работает. Поправили код -- стало работать `f(b)`, вроде закончили. Но при этом забыли заново протестировать `f(a)` -- упс, вот и возможная ошибка в коде.
2020

2121
**Автоматизированное тестирование -- это когда тесты написаны отдельно от кода, и можно в любой момент запустить их и проверить все важные случаи использования.**
2222

@@ -26,15 +26,15 @@
2626

2727
BDD -- это не просто тесты. Это гораздо больше.
2828

29-
**Тесты BDD -- это три в одном: И тесты И документация И примеры использования одновременно.**
29+
**Тесты BDD -- это три в одном: И тесты, И документация, И примеры использования.**
3030

3131
Впрочем, хватит слов. Рассмотрим примеры.
3232

3333
## Разработка pow: спецификация
3434

3535
Допустим, мы хотим разработать функцию `pow(x, n)`, которая возводит `x` в целую степень `n`, для простоты `n≥0`.
3636

37-
Ещё до разработки мы можем представить себе, что эта функция будет делать и описать это по методике BDD.
37+
Ещё до разработки мы можем представить себе, что эта функция будет делать, и описать это по методике BDD.
3838

3939
Это описание называется *спецификация* (или, как говорят в обиходе, "спека") и выглядит так:
4040

@@ -69,11 +69,11 @@ describe("pow", function() {
6969

7070
1. Пишется спецификация, которая описывает самый базовый функционал.
7171
2. Делается начальная реализация.
72-
3. Для проверки соответствия спецификации мы задействуем одновременно фреймворк, в нашем случае [Mocha](http://mochajs.org/) вместе со спецификацией и реализацией. Фреймворк запускает все тесты `it` и выводит ошибки, если они возникнут. При ошибках вносятся исправления.
72+
3. Для проверки соответствия спецификации мы задействуем фреймворк (в нашем случае [Mocha](http://mochajs.org/)). Фреймворк запускает все тесты `it` и выводит ошибки, если они возникнут. При ошибках вносятся исправления.
7373
4. Спецификация расширяется, в неё добавляются возможности, которые пока, возможно, не поддерживаются реализацией.
74-
5. Идём на пункт 2, делаем реализацию, и так далее, до победного конца.
74+
5. Идём на пункт 2, делаем реализацию. И так "до победного конца".
7575

76-
Разработка ведётся *итеративно*, один проход за другим, пока спецификация и реализация не будут завершены.
76+
Разработка ведётся *итеративно*: один проход за другим, пока спецификация и реализация не будут завершены.
7777

7878
В нашем случае первый шаг уже завершён, начальная спецификация готова, хорошо бы приступить к реализации. Но перед этим проведём "нулевой" запуск спецификации, просто чтобы увидеть, что уже в таком виде, даже без реализации -- тесты работают.
7979

@@ -126,11 +126,11 @@ function pow() {
126126

127127
Функция, конечно, ещё не готова, но тесты проходят. Это ненадолго :)
128128

129-
Здесь мы видим ситуацию, которая (и не обязательно при ленивом программисте!) бывает на практике -- да, есть тесты, они проходят, но увы, функция работает неправильно.
129+
Здесь мы видим ситуацию, которая (и не обязательно при ленивом программисте!) бывает на практике -- да, есть тесты, они проходят, но функция (увы!) работает неправильно.
130130

131131
**С точки зрения BDD, ошибка при проходящих тестах -- вина спецификации.**
132132

133-
В первую очередь не реализация исправляется, а уточняется спецификация, пишется (падающий) тест.
133+
В первую очередь не реализация исправляется, а уточняется спецификация, пишется падающий тест.
134134

135135
Сейчас мы расширим спецификацию, добавив проверку на `pow(3, 4) = 81`.
136136

@@ -166,7 +166,7 @@ function pow() {
166166
});
167167
```
168168

169-
Их принципиальное различие в том, что если `assert` обнаруживает ошибку, то он тут же прекращает выполнение блоки `it`. Поэтому в первом варианте, если вдруг первый `assert` "провалился", то про результат второго мы никогда не узнаем.
169+
Их принципиальное различие в том, что если `assert` обнаруживает ошибку, то он тут же прекращает выполнение блока `it`. Поэтому в первом варианте, если вдруг первый `assert` "провалился", то про результат второго мы никогда не узнаем.
170170

171171
**Таким образом, разделить эти тесты может быть полезно, чтобы мы получили больше информации о происходящем.**
172172

@@ -345,7 +345,7 @@ describe("pow", function() {
345345

346346
Однако, между этими вызовами есть отличие в деталях сообщения об ошибке.
347347

348-
При "упавшем" `assert` в примере выше мы видим `"Unspecified AssertionError"`, то есть просто "что-то пошло не так", а при `assert.equal(value1, value2)` -- будут дополнительные подробности: `expected 8 to equal 81`.
348+
При "упавшем" `assert` в примере выше мы видим `"Unspecified AssertionError"`, то есть просто "что-то пошло не так", а при `assert.equal(value1, value2)` будут дополнительные подробности: `expected 8 to equal 81`.
349349

350350
**Поэтому рекомендуется использовать именно ту проверку, которая максимально соответствует задаче.**
351351

@@ -417,7 +417,7 @@ describe("pow", function() {
417417

418418
**Код, покрытый автотестами, являет собой полную противоположность этому!**
419419

420-
Даже если какое-то изменение потенциально может порушить всё -- его совершенно не страшно сделать. Ведь есть масса тестов, которые быстро и в автоматическом режиме проверят работу кода и, если что-то падает -- это можно будет легко локализовать и поправить.
420+
Даже если какое-то изменение потенциально может порушить всё -- его совершенно не страшно сделать. Ведь есть масса тестов, которые быстро и в автоматическом режиме проверят работу кода. И если что-то падает, то это можно будет легко локализовать и поправить.
421421

422422
**Кроме того, код, покрытый тестами, имеет лучшую архитектуру.**
423423

0 commit comments

Comments
 (0)