Как написать модульные тесты для следующего сценария?
Программа для тестирования - это синтаксический анализатор, который распознает различные структуры на своем входе. Вы можете думать об этом как о синтаксическом анализе языка разметки.
Основная проблема заключается в распознавании структур в тексте при совпадении определенных шаблонов. На практике это не будут регулярные выражения, но для этих вопросов следует подумать о них как о таковых.
Проблема
Предположим, я хочу идентифицировать номера комнат и иметь шаблон p, соответствующий им в частях ввода, которые не соответствуют ни одному другому шаблону p2 из набора шаблонов (например, разделы верхнего и нижнего колонтитула моего воображаемого входного документа) .
Я мог бы представить написание модульных тестов, которые ожидают, что для заданного ввода будет найдено несколько номеров. Однако создание хороших тестов, в частности, пограничных случаев, здесь действительно проблематично.
Тестирование:
Интересные тест-кейсы должны как-то учитывать различные комбинации шаблонов. В частности, принимается решение, соответствует ли какой-либо текст шаблону номеров комнат в тривиальном и более (предоставленном, все еще важном) удобном модульном тесте. Я могу выделить несколько видов тестов:
1.:
"007" - expect: false
"01-001" - expect: true
"R02-33b" - expect: true
"01-001andsometext" - expect: false
"01-001 andsometext" - expect: true
"02-33X" - expect: false
"" - expect: false
2.:
"We meet in R01-001. Please invite agent 007." -- expect 1 matching rooms
"Excercise groups take place in 02-23b and 02-33c." --- expect 2 matches
...
3.:
Integration test style.
Long input with room numbers in the texts and in header/footer
where I only want to recognize n rooms:
"... 150+ character string ..." - expect exactly 7 matches,
check if the right ones are matched
Несмотря на то, что первый тест представляет собой совершенно прекрасный модульный тест, который действительно тестирует только очень фиксированную часть моей программы, о сложных случаях также очень легко забыть. Глядя на второй пример, я мог бы сказать себе: «Чувак, мне следовало включить тестовый пример, в котором после номера комнаты следуют точка, знак вопроса и т. Д.».
Однако второй пример не намного лучше. В частности, я все еще могу пропустить множество «граничных случаев», потому что для парсера их очень много (другие знаки пунктуации, Unicode и т. Д.).
Но даже помимо этого, я действительно хочу не только обнаруживать номера комнат определенного формата, но и отбрасывать те, которые находятся в «плохих» разделах. Тестирование синтаксического анализа «настоящий / типичный» кажется ужасной практикой модульных тестов: едва читаемый, ожидаемый результат склонен к изменениям в других частях (установленных «плохих» шаблонах) моей программы и т. Д.
Мой вывод пока
Каким-то образом я думаю, что захочу написать типовые модульные тесты - во многом как в моем примере 1. Тем не менее, я думаю, что мне понадобится много разных видов ввода и я все еще пропущу гораздо больше граничных случаев (например, пунктуация юникода) и так далее), чем я обычно делаю для других моих функций, которые работают с числами, деревьями, графиками и т. д. Поэтому я действительно надеюсь получить совет от кого-то, у кого у вас больше опыта работы со строковым вводом.