Расскажу об одной технике, которая, как мне кажется, позволяет писать более
понятные и читаемые юнит тесты. Начну немного издалека. Допустим мы хотим
убедится, что определенный кусок кода работает правильно. Если бы мы имели дело
с игрушечным примером, то это наш тест мог бы Примерно вот так:
Такой тест достаточно легко читать. Достаточно понять конструкцию
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 милях от атомной станции. Проживание на том же расстоянии от
угольной электростанции дает дозу в три съеденных банана.
Расскажу как я провел прошлую пятницу. Провел я её пытаясь понять, почему
простой как доска тест-кейс не работает.
Тест-кейс запускает код в среде, которая симулирует полетное окружение: среду
выполнения, показания датчиков и т.д. Далее выполняется простой сценарий -
тест-кейс получает телеметрию и выполняет действия/проверки по наступлению
определенных событий. Например, тест-кейс может запустить ракету, выключить
четвертый двигатель, когда высота превысит сотню метров, а затем проверить, что
код корректно обработал нештатную ситуацию.
Такие тест-кейсы, естественно, не пишутся с нуля. Кейс набирается из уже
готовых, давно написанных блоков. Что может быть очень простым делом (если есть
готовый шаблон), или не очень простым (когда такой шаблон нужно создать самому).
В этот раз случился как раз второй вариант. Когда все компоненты теста правильно
соединены остается только написать код, который ждет наступления интересных
событий и реагирует на них нужным образом.
К пятнице я добрался до момента, когда сценарий тест-кейса уже написан, но еще
не работает. Сценарий вылетал по таймауту ожидая наступления одного из событий.
При этом телеметрия четко показывала, что событие наступило и у теста был вагон
времени, чтобы это заметить. Интересно, что точно такой же код, отслеживающий
другую телеметрию работал как часы. Хм.