Вы должны всегда проверять свое регулярное выражение, как и любой другой фрагмент кода. Это самая простая функция, которая принимает строку и возвращает логическое значение или возвращает массив значений.
Вот несколько советов о том, что следует думать, когда речь идет о разработке модульных тестов для регулярных выражений. Это не жесткие и быстрые рецепты для разработки модульных тестов, а некоторые рекомендации для формирования вашего мышления. Как всегда, сравните потребности вашего тестирования с затратами на отказ, уравновешенными временем, необходимым для их реализации. (Я считаю, что «внедрение» теста - это простая часть!: -])
Очки для рассмотрения:
- Думайте о каждой группе (скобках) как о фигурной скобке.
- Думай о каждом | как условие. Обязательно проверяйте для каждой ветви.
- Думайте о каждом модификаторе (*, +,?) Как об отдельном пути.
- (примечание к вышесказанному: помните разницу между *, +,? И * ?, +? И ??.)
- для \ d, \ s, \ w и их отрицаний, попробуйте несколько в каждом диапазоне.
- Для * и + вам нужно проверить «нет значения», «один из» и «один или несколько» для каждого.
- Для важных «управляющих» символов (например, строк в искомом регулярном выражении) проверьте, что произойдет, если они появятся в неправильных местах. Это может вас удивить.
- Если у вас есть данные реального мира, используйте их как можно больше.
- Если вы этого не сделаете, обязательно протестируйте как простые, так и сложные формы, которые должны быть действительными.
- Обязательно проверьте, что делают управляющие символы регулярных выражений при вставке.
- Убедитесь, что пустая строка правильно принята / отклонена.
- Убедитесь, что строка каждого из различных видов пробелов правильно принята или отклонена.
- Убедитесь, что выполнена правильная обработка нечувствительности к регистру (флаг i). Это разбило меня больше, чем почти все остальное при разборе текста (кроме пробелов).
- Если у вас есть параметры x, m или s, убедитесь, что вы понимаете, что они делают, и проверьте их (поведение здесь может быть другим)
Для регулярного выражения, которое возвращает списки, также помните:
- Убедитесь, что ожидаемые данные возвращены в правильном порядке в правильные поля.
- Убедитесь, что небольшие изменения не возвращают хорошие данные.
- Убедитесь, что смешанные анонимные группы и именованные группы анализируются правильно (например,
(?<name> thing1 ( thing2) )
) - это поведение может отличаться в зависимости от используемого вами механизма регулярных выражений.
- Еще раз проведите множество испытаний в реальном мире.
Если вы используете какие-либо расширенные функции, такие как группы без возврата, убедитесь, что вы полностью понимаете, как работает эта функция, и, используя приведенные выше рекомендации, создайте примеры строк, которые должны работать для каждой из них и против них.
В зависимости от реализации вашей библиотеки регулярных выражений способ захвата групп также может быть разным. Perl 5 имеет порядок «открытый порядок», в C # это частично, за исключением именованных групп и так далее. Не забудьте поэкспериментировать с вашим ароматом, чтобы точно знать, что он делает.
Затем интегрируйте их прямо с другими вашими модульными тестами, либо в их собственном модуле, либо рядом с модулем, содержащим регулярное выражение. Для особенно неприятного регулярного выражения вам может понадобиться множество тестов, чтобы убедиться, что шаблон и все используемые вами функции верны. Если регулярное выражение выполняет большую (или почти всю) работу, выполняемую этим методом, я воспользуюсь приведенным выше советом для формирования входных данных для тестирования этой функции, а не непосредственно для регулярного выражения. Таким образом, если позже вы решите, что регулярное выражение не подходит, или вы хотите его разбить, вы можете зафиксировать поведение, предоставленное регулярным выражением, без изменения интерфейса - т. Е. Метод, который вызывает регулярное выражение.
Пока вы действительно знаете, как функция regex должна работать в вашем стиле regex, вы должны быть в состоянии разработать для нее достойные тестовые примеры. Просто убедитесь, что вы действительно понимаете, как работает эта функция!