В предыдущем посте про табличные юнит тесты я рассказал про способ
улучшения читаемости однообразных юнит тестов. Там же мне в комментариях
аналогичных примеров из существующих фреймворков накидали. Теперь давайте
посмотрим как этот способ сделать еще лучше.
Основная идея была очень проста. Есть повторяющийся, очень монотонный код
тестов. Чтобы сделать его читаемым, пишется универсальное тело теста, а все
необходимые вариации описываются параметрами. Параметры упаковываются в таблицу,
что очень важно для улучшения читаемости. Когда все параметры собраны в одном
месте (в пределах одного экрана), анализировать поведение тестируемого кода
легче, чем когда параметры разбросаны по файлу длиной в сотни строк.
Как сделать код еще более понятным? К примеру, возьмем таблицу из предыдущего
поста. Что с ней не так?
В этой таблице слишком много знаков препинания: скобки, запятые, кавычки.
К параметрам в этой таблице неудобно писать комментарии и еще сложнее подружить
удобно выровненные колонки с clang-format (clang-format off - это
единственный выход). Более того, столкнувшись с реальностью, подобная таблица
станет еще менее читаемой - колонки вылезут за правый край экрана, выравнивание
будет принесено в жертву более компактной записи и т.д.
Расскажу об одной технике, которая, как мне кажется, позволяет писать более
понятные и читаемые юнит тесты. Начну немного издалека. Допустим мы хотим
убедится, что определенный кусок кода работает правильно. Если бы мы имели дело
с игрушечным примером, то это наш тест мог бы Примерно вот так:
Такой тест достаточно легко читать. Достаточно понять конструкцию
ASSERT_XXX(foobar(...)) после чего глаза сами фокусируются на входных
значениях, автоматически отсеивая ненужный синтаксический мусор.
Однако, если взять реальный код, то подобный пример превратиться в гораздо менее
удобочитаемого монстра:
std::unique_ptr<Foobar> rabbit = create_foobar_with_abc(parent,
some_context,
more_stuff + that + is_required + to_create_foobar,
a,
b,
mock_c(),
logger);
ASSERT_TRUE(
rabbit->connect(
this_thing,
that_key,
did_you_think_we_are_done_here ? no : hell_no));
ASSERT_TRUE(rabbit->wait_for_accept(timeout));
ASSERT_FALSE(rabbit->foobar(0, 0));
… и так далее для каждого тест кейса. Подобный код легко превращается в
длинную простыню однообразного текста с незаметными, но важными вариациями во
входных данных или параметрах инициализации.
О! Отличная, годная блок-схема, дающая ответ на вопрос “Что это за хрень в небе
была?” в девяноста случаях из ста (по клику открывается более крупный вариант):
Хочу особенно обратить внимание на то, как красиво это выступление снято - прямо
целая история рассказана. Столько интересных мелочей. У “wah, wah, wah”
солистки - сережки-револьверы. :-)
А вот вы знали, что обыкновенное ирландское имя Siobhán произносится “шивон”
/ʃɪˈvɔːn/? А Tadgh произносится как “тайг” /taɪɡ/? Вот и я недавно узнал.
Я покопался немного в сети и у меня получился следующий список. Русская
транскрипция составлена по принципу “Рабинович по телефону напел” - все нюансы
(ударение, звуки, которые невозможно изобразить кириллицей, длина и
тональность) - полностью потеряны. Фонетическая транскрипция (если указана)
скопирована из Википедии. В квадратных скобках указана ирландская
транскрипция, в косых - английская.
Ailbhe - “элвиа” [ˈalʲvʲə]
Aisling - “ашлин” [ˈaʃlʲɪŋ]
Aoibheann - “эйвин”
Aoibhlinn - “эйвлин” /ˈiːfə/
Aoife - “ифа” /ˈiːfə/
Caoimhe - “квива” /ˈk(w)iːvə/
Ciara - “киира” /siːˈɛrə/
Cliodhna - “клиона”
Deirdre - “диирдра” /ˈdɪərdrə/
Dianaimh - “дианаф”
Eilish - “эйлиш”
Kieran - “кирэн” [ˈciəɾˠaːn̪ˠ]
Méabh - “мэйв” [mʲeːv]
Niamh - “нииф” [ˈniːəv]
Odhrán - “оран”
Orlagh - “орла”
Roisin - “рошин”
Sadhbh - “сайв”
Saoirse - “сирша” [ˈsˠiːɾʲʃə]
Seoidín - “шоудиин”
Sinéad - “шинэйд” /ʃɪˈneɪd/
Áine - “ааню” [ˈaːnʲə]
В качестве бонуса - небольшая шутка, объясняющая особенности произношения:
After centuries of English occupation, we had to become inventive in how we
pissed them off. Coming up with unpronounceable names was a great way to see
the English make twits out of themselves and us to have a laugh at them
После веков английской оккупации, мы просто должны были стать мастерами
выведения их [англичан] из себя. Использование непроизносимых имен было
отличным способом выставить англичан дураками и дать нам возможность
посмеяться над ними.
:-)
P.S. На самом деле - ирландский язык происходит из другой языковой группы.
В комментариях к предыдущей заметке про ядерную энергетику было высказано махровое
недоверие цифре в 1.8 миллионов жизней, которые использование ядерной энергии
позволило сохранить. Давайте разберемся откуда взялась эта цифра.
О чем же говорит это исследование? Количество предотвращенных смертей в период
с 1971 по 2009 год оценивается в 1.84 миллиона. За год в период с 2000 по 2009
год предотвращается в среднем 76 тысяч смертей. Для сравнения в Германии,
которая обязалась отказаться от ядерной энергии до 2022 года, использование
ядерной энергии предотвратило около 117 тысяч смертей в период с 1971 по 2009
год (диапазон оценки - от 29 до 470 тысяч).
Сколько жизней было потеряно в следствие использования атомной энергетики?
В мире за период с 1971 по 2009 годы авторы исследования насчитали 4900 смертей.
Причем авторы отмечают (и подтверждают ссылками на работы других
исследователей), что линейная модель, которую они использовали для оценки имеет
тенденцию значительно завышать результат в случае аварий с малой интенсивностью
радиоактивного фона (все аварии кроме Чернобыля, включая Фукусиму и аварию на
Трехмильном острове). Оценка в 4900 смертей может быть завышена на два порядка.
В общем я не знаю, как с такими цифрами можно ратовать против атомной
энергетики. Разница в 370 раз - это как бы over дофига.
Сегодня наконец получил эмблему посвященную запуску Falcon Heavy Demo. Эмблема
раза в полтора больше, чем обычно. В неё вплетены нити, слетавшие на одном из
боковых бустеров:
Интересное выступление Майкла Шелленбергера с TEDx: “Почему я поменял свое
мнение о ядерной энергии”. Майкл, в прошлом горячий противник ядерной
энергетики, объясняет почему ядерная энергия чище, чем энергия ветра и
Солнца.
Несколько цифр:
На каждый киловатт энергии добытой с помощью солнечных панелей в атмосферу
выбрасывается в 4 раза больше углекислого газа, чем на киловатт добытый на
атомной станции.
В пересчете на киловатт, солнечные панели генерируют в 300 раз больше
отходов, чем атомная энергетика.
84% всей ионизирующей радиации, которой подвержен “средний человек” имеет
естественное происхождение; 15% - приходится на медицину. На атомные аварии
включая Чернобыль и Фукусиму приходится меньше 0.3%.
Использование атомной энергии сохранило жизни 1.8 миллиону человек (за счет
снижения загрязнения окружающей среды). Сжигание угля, кстати, приводит к
большему количеству радиоактивных выбросов, чем атомная энергетика.
Ну и знаменитое - один съеденный банан дает большую дозу излучения, чем
проживание в 50 милях от атомной станции. Проживание на том же расстоянии от
угольной электростанции дает дозу в три съеденных банана.