Вы можете проверить только то поведение, которое, как вы знаете, можно ожидать.
Знаете ли вы, что существует решение для некоторых тестовых данных? Например. вы можете вручную выяснить, что на доску 8x8 определенно можно поставить шесть ферзей, или вы можете прочитать в книге, что существует хотя бы одно решение для размещения восьми ферзей на доске 8х8. Затем вы можете проверить, что ваша программа возвращает хотя бы одно решение (возможно, вы не проверяете, является ли оно верным решением).
Знаете ли вы, что не существует решения для некоторых других тестовых данных? Например. Вы можете легко убедить себя, что невозможно поставить три королевы на 3х3 или девять на 8х8. Затем проверьте, что ваша программа не возвращает решение или выдает ожидаемое исключение.
Хотите проверить, что данное решение действительно? Затем вы должны написать код, проверяющий его правильность, и вам нужно запустить этот код, независимо от того, насколько сложным он может быть. Если он достаточно сложный, напишите и тесты для него. Если вам повезет, ваша программа может быть подвергнута рефакторингу, так что вы сможете повторно использовать некоторые ее меньшие части для тестирования своего решения (можно повторно использовать эти меньшие части, вы не будете «вносить ту же ошибку», потому что тщательно протестировали эти части) тоже).
Наконец, как только вы обнаружите ошибку, у вас есть пример того, как программа возвращает неожиданный результат. Напишите тест, утверждающий, что он не вернет этот результат в следующий раз.
Вы не можете иметь 100% тестовое покрытие ни для одной программы. Все, что вы можете сделать, это проверить дела, о которых вы знаете, и у вас есть время написать.