Ответ 1
Вы можете взять идею из производства электроники и поставить тестовые крючки непосредственно в производственный код. Подобно тому, как монтажная плата может быть изготовлена со специальными местами для испытательного оборудования для контроля и зондирования схемы, мы можем сделать то же самое с кодом.
Предположим, что у нас есть код, вставляющий строку в базу данных:
class TestSubject
def insert_unless_exists
if !row_exists?
insert_row
end
end
end
Но этот код работает на нескольких компьютерах. Там есть условие гонки, так как другие процессы могут вставлять строку между нашим тестом и нашей вставкой, вызывая исключение DuplicateKey. Мы хотим проверить, что наш код обрабатывает исключение, которое возникает в результате этого состояния гонки. Чтобы это сделать, нашему тесту нужно вставить строку после вызова row_exists?
, но перед вызовом insert_row
. Поэтому добавьте тестовый крюк прямо здесь:
class TestSubject
def insert_unless_exists
if !row_exists?
before_insert_row_hook
insert_row
end
end
def before_insert_row_hook
end
end
При запуске в дикой природе, крючок ничего не делает, кроме как съесть крошечный бит процессорного времени. Но когда код тестируется на состояние гонки, тестовые обезьяны-патчи before_insert_row_hook:
class TestSubject
def before_insert_row_hook
insert_row
end
end
Не так ли? Как паразитическая личинка осы, которая захватила тело ничего не подозревающей гусеницы, тест угнал проверенный код, чтобы он создал точное условие, которое нам нужно проверить.
Эта идея так же проста, как и курсор XOR, поэтому я подозреваю, что многие программисты самостоятельно ее изобрели. Я нашел, что это вообще полезно для тестирования кода с условиями гонки. Надеюсь, это поможет.