День 15 · Контрольная точка 3: функции, тесты и репозиторий · страница 4 из 4

Контрольная точка 3

Восемь задач по блоку 3: свои функции, несколько результатов, error, разбиение задачи, тесты. По ним видно, какие темы осели. Блок 4 — срезы и карты — строится поверх функций: значения там начинают ходить между функциями пачками, и незасчитанная задача показывает, что повторить до него.


Задачи

Условие — в TASK.txt папки задачи, числа у каждого стажёра свои.

№ Папка Что сделать Где перечитать
1 kt1 тариф и цена одной функцией с двумя результатами день 12; памятка, «Несколько результатов»
2 kt2 разбор числа: error как результат и код возврата 1 день 12; памятка, «error»
3 kt3 разобрать простыню на функции, вывод прежний день 13; страница 1
4 kt4 свой тест на готовую функцию день 14; страница 1
5 kt5 табличный тест на четыре случая и больше день 14; памятка, «Табличный тест»
6 kt6 починить программу по упавшему тесту день 14; страница 1
7 kt7 таблица трассировки вызовов день 11; правила — в kt7/TASK.txt
8 kt8 что выведет: копия аргумента и затенение дни 11 и 12; памятка
Пример · только посмотреть, набирать не нужно
stagiaire@lab:~$ cd ~/gocourse/day15/kt1
stagiaire@lab:~/gocourse/day15/kt1$ cat TASK.txt
Контрольная точка 3. Задача 1 — тариф и цена одной функцией.

Программа читает вес посылок в граммах, по строке на посылку. Пустые
строки и строки из одних пробелов пропускаются, пробелы по краям числа
не мешают. Не чисел во вводе не бывает, отрицательных весов тоже.

Дальше в TASK.txt — что должна делать программа, главное требование задачи, примеры с вашими числами и как задача проверяется.


Как сдаётся

Всё проверяет course check 15. Отдельно сдаётся только ответ на задачу 8 — два числа через пробел вместо слова ЧИСЛА; отправить заново можно:

Пример · только посмотреть, набирать не нужно
stagiaire@lab:~/gocourse/day15/kt8$ course answer day15.kt8 40 12
Принято: day15.kt8 = 40 12

Вместо 40 12 — два своих числа.

Программы с вводом (задачи 1–3) проверка запускает на наборе вводов. Первые случаи — примеры из TASK.txt, на них при расхождении видно и то, что было нужно. Остальные скрыты: видно только ввод и то, что напечатала программа.

Вывод · это печатает программа, набирать не нужно
  ✘  Задача 1 — тариф и цена функцией с двумя результатами
       Условие: cat ~/gocourse/day15/kt1/TASK.txt — проверьте границы тарифов.
       следующий уровень подсказки: course hint 15 kt1
         случай 4 из 11, ввод: 900
         строка 1, программа напечатала: «Посылка 1: средний, 230 руб.»

Нужный ответ решаете вы по правилам из TASK.txt. Проверка останавливается на первом неверном случае — после починки может всплыть следующий. В задаче 2 обычный вывод, поток ошибок и код возврата сверяются отдельно, и проверка называет, что именно не совпало.

Задачи 1 и 2 дополнительно смотрят на устройство программы, а не только на вывод: функция, про которую задача, должна быть не только объявлена, но и вызвана, и её результаты приняты в переменные. В задаче 2 проверяется ещё, что ошибка именно возвращается: os.Exit и печать в поток ошибок — в main, а не внутри функции разбора. Мёртвая функция-заглушка рядом с расчётом в main зачёта не даёт.

Задача 3 дополнительно считает свои функции и строки тел: в main не больше 32 строк, своих функций не меньше трёх, и ни одна функция не длиннее 20 строк. Пустые func x() {} и функции, которых никто не вызывает, за свои не считаются, а весь main, переложенный в одну функцию, — это та же простыня. Вывод при этом обязан остаться прежним — это и есть смысл задачи. Эти числа — не правило «функция не длиннее N строк», которого в курсе нет (день 13, страница 1): это порог, которым проверка отличает разрезанную программу от переложенной. Внутри порога длина не оценивается.

Ваши тесты (задачи 4 и 5) проверяются подменой. Сначала go test запускается на вашей работе — он обязан пройти. Потом проверка берёт копию каталога, подменяет в ней реализацию заведомо неверной и запускает ваш тест ещё раз — теперь он обязан упасть. Ваши файлы при этом не трогаются.

Вывод · это печатает программа, набирать не нужно
  ✘  Задача 4 — свой тест на orderCost ловит подмену
       Тест проходит и на заведомо неверной программе — значит, он ничего не проверяет. Добавьте случай, на котором ошибка видна, и сравнивайте результат с ожидаемым.
       следующий уровень подсказки: course hint 15 kt4

Вторая подмена — другая запись той же логики: функция считает ровно то же самое, но другими строками. На ней ваш тест обязан пройти. Тест, который вместо результата вызова разглядывает текст cost.go или fee.go, на такой подмене падает и зачёта не получает.

Вывод · это печатает программа, набирать не нужно
  ✘  Задача 5 — табличный тест на packFee ловит подмену на границе
       Тест падает на другой записи той же логики: он проверяет не поведение функции, а её текст или окружение. Сравнивайте результат вызова с ожидаемым.
       следующий уровень подсказки: course hint 15 kt5

В задаче 5 подмена отличается от верной функции ровно на границе бесплатной упаковки: таблица без случая «ровно на границе» её не заметит. Реализации (cost.go, fee.go, limits.go) менять не нужно — проверка сверяет их с оригиналом.

Задача 6 проверяется скрытым авторским тестом: в нём другие числа, чем в stock_test.go. Файл stock_test.go менять нельзя, в stock.go можно изменить не больше двух строк — чинят программу, а не тест.

Таблица в kt7 сверяется целиком: одна неверная клетка — задача не засчитана, и какая именно, проверка не говорит. Правила таблицы — те же, что весь курс: новых правил контрольная не вводит, действуют правила 1–24. Все двадцать четыре собраны списком в памятке блока 3 — course page 15 2, раздел «Трассировка: правила 1–24»; держите его открытым рядом. Для вызовов главные — 16–20, и самое забываемое из них — правило 18: строка заголовка функции тоже шаг.

kt7/main.go и kt8/main.go менять не нужно: номера строк в таблице и ответ на задачу 8 считаются по тем файлам, какие положил стенд, — проверка сверяет их с оригиналом. Отладочная печать — в копии в scratch.


Коммиты

Работа дня должна лежать в репозитории ~/gocourse/day15: не меньше восьми коммитов — начальные плюс по одному на задачу. Это отдельный пункт дня, в контрольную точку он не входит, но на порог дня влияет.

Вывод · это печатает программа, набирать не нужно
  ✘  Работа дня лежит в репозитории ~/gocourse/day15 (коммитов: 3, нужно от 8)

Порог и пересдача

Задача засчитана целиком или не засчитана. Порог — 6 задач из 8. Итог по точке на пустом стенде:

Вывод · это печатает программа, набирать не нужно
--- контрольная точка 3 ---
Задач сдано: 0 из 8. Порог — 6. Пересдача — доделайте задачи и повторите course check 15.

День закрывается при трёх условиях: сдано 10 пунктов из 13 — ритуал перед коммитом и задачи вместе; точка взята; сданы контрольные вопросы. Без точки день не закроется при любом числе пунктов:

Вывод · это печатает программа, набирать не нужно
Контрольная точка не взята: 5 из 8 при пороге 6.
День не закрыт: пункты контрольной обязательны.

Когда пункты и точка сданы, проверка отправит к course quiz 15; после вопросов — ещё раз course check 15.

Пересдача — повторный course check 15, попыток сколько угодно. Между проверками — не меньше 15 секунд, каждая попытка пишется в ~/.course/checks. Свой прогон — go test . и примеры из TASK.txt — быстрее паузы.


Подсказки и время

course hint 15 kt3 работает и на контрольной. Третий уровень — готовое решение, он попадает в отчёт: задача засчитается, но тему, которая не осела, уже не покажет. Застряли — по порядку: перечитать TASK.txt; прогнать примеры или написать тест на спорный случай; памятка; двадцать минут своей отладки; только потом первый уровень подсказки.

На контрольную заложите около трёх часов. Первые десять минут прочитайте все восемь TASK.txt. Начните с задач, в которых уверены. Получас на задачу — это не норма, а сигнал: просидели над одной полчаса без движения — отложите её и берите следующую, вернётесь потом. course check 15 — после каждой решённой задачи, и коммит.


Что может пойти не так

Что видите Что это значит Что делать
в kt1 нет файлов .go main.go не создан или лежит в другой папке ~/gocourse/day15/kt1/main.go
в программе нет функции с двумя результатами тариф и цена считаются прямо в main вынести в функцию (string, int)
её никто не вызывает так, чтобы оба результата пригодились функция объявлена, но расчёт остался в main позвать её: name, price := tariff(weight)
в теле main стоит число тарифа (900) границы или цены переехали не полностью все числа тарифов — внутри функции
в программе нет функции с результатом error ошибка печатается внутри функции разбора вернуть её вторым результатом
функция parseNumber печатает ошибку или сама вызывает os.Exit функция решает за вызывающего return 0, errors.New(…), а печать и os.Exit(1) — в main
своих функций в задаче: 1, нужно не меньше трёх простыня осталась простынёй выносить по одному куску, после каждого — прогон и коммит
в функции doEverything строк: 41 — ни одна функция не должна быть длиннее 20 main целиком переехал в одну функцию резать по швам: разбор строки, расчёт, печать
строк в теле main: 34, можно не больше 32 вынесена только печать вынести ещё разбор строки или расчёт
файл cost.go изменён, а менять его в этой задаче не нужно правили функцию вместо того, чтобы писать тест cp ~/.course/orig/day15/kt4/cost.go ~/gocourse/day15/kt4/cost.go
Нет файла с тестом в каталоге задания: он называется на _test.go тест назван иначе или лежит не там kt4/cost_test.go, kt5/fee_test.go
Сначала добейтесь, чтобы go test проходил на вашей программе ваш тест падает уже на верной функции ожидаемое число посчитано неверно — пересчитайте по условию
Тест проходит и на заведомо неверной программе тест ничего не сравнивает или пропустил границу добавить случай, на котором ошибка видна
строк с полем want в таблице случаев: 2, нужно не меньше четырёх случаев мало, или want стоит в комментарии, а не в строке таблицы дописать строки самой таблицы, форма — памятка
в тесте нет цикла по таблице случаи расписаны по одному, без таблицы for _, c := range cases
в stock.go изменено строк: 6, можно не больше 2 функция переписана целиком cp оригинала и точечная правка
файл stock_test.go изменён починили тест вместо программы вернуть тест из ~/.course/orig/day15/kt6
В таблице осталось знаков ?: 42 таблица не заполнена заменить каждый ?
Строк с шагами в таблице 11, а нужно 12 строка таблицы удалена вернуть число строк заготовки
файл main.go изменён, а менять его в этой задаче не нужно в kt7 или kt8 добавлена отладочная печать cp оригинала, опыты — в scratch
программа работала дольше 5 секунд и была остановлена цикл не кончается или программа ждёт ввода проверить условие цикла

Материал дня закончен. Задания — course lab 15, дополнительное чтение — course extra 15