Вы можете заимствовать идею из производства электроники и вставлять тестовые зацепки непосредственно в производственный код. Так же, как может быть изготовлена печатная плата со специальными местами для испытательного оборудования для контроля и проверки цепи, мы можем сделать то же самое с кодом.
Предположим, у нас есть код, вставляющий строку в базу данных:
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, поэтому я подозреваю, что многие программисты изобрели ее самостоятельно. Я нашел, что это в целом полезно для тестирования кода с условиями гонки. Надеюсь, это поможет.