Может ли одно только тестирование черного ящика отлавливать все ошибки, которые обнаруживает тестирование белого ящика?
Можно ли найти ошибку при тестировании белого ящика, которую нельзя найти при тестировании черного ящика?
Если это так, то почему?
Насколько я понимаю, это невозможно, но я бы хотел знать наверняка.
1 ответ
Я могу попробовать.
Ответ может быть "нет" в том смысле, что если вы предоставите все возможные входные данные для действия, вы сможете проверить, правильно ли приложение ведет себя во всех возможных ситуациях, поэтому тестирование черного ящика в конечном итоге выявит каждую ошибку.
Но на самом деле обеспечить каждый возможный вклад для каждого возможного действия нелегко (или невозможно все вместе иногда). Другими словами, очень трудно написать тест для каждого возможного пути в коде вашего приложения, даже не увидев код. Тестирование белого ящика гораздо эффективнее в выявлении странных случаев, потому что вы можете увидеть реализацию. Очень простым примером будет то, что вы знаете границы в конкретном операторе if.
Допустим, у вас есть очень простая программа с фрагментом кода, подобным следующему:
if (input < 0) {
print("Input is negative");
} else if (input >= 0 && input <= 60) {
print("Input is between 0 and 60, inclusive");
} else if (input > 60 && input < 70) {
print("Input is between 50 and 70, exclusive); //error
} else {
print("Blah");
}
С тестированием белого ящика очень легко покрыть все ветви. Вы знаете, что набор [-1, 5, 65, 80], например, попадет во все ветви, а затем вы найдете ошибку в третьей ветви. При тестировании черного ящика вы не представляете, каковы условия ветвления. Вы можете догадаться, что [0, 5] поразит все ветви. Или вы можете догадаться, что [0, 1, 56, 67, 454, 45454, 454545454] поразят все ветви. Чтобы убедиться, что вы попали во все ветви и ни в одной из них нет ошибок, вам нужно будет ввести каждое число, что невозможно.
Я не говорю, что каждое приложение имеет полное покрытие кода, это далеко не так. Но вернемся к первоначальному вопросу:
Можно ли найти ошибку при тестировании белого ящика, которую нельзя найти при тестировании черного ящика?
Если вы хотите доказать, что ответ "нет" только для одной программы, вы должны иметь полное покрытие кода, используя только тестирование черного ящика. Это может быть выполнимо в очень тривиальных программах, но быстро перерастет в почти невозможное, поскольку ваша программа становится все более сложной.