Как сделать так, чтобы юнит-тест всегда проходил? - PullRequest
4 голосов
/ 05 июня 2010

Давайте предположим, что кто-то должен написать решение проблемы, и я должен проверить его решение с помощью нескольких тестов. Возможно ли (возможно, с размышлениями или чем-то еще) его программа пройти все мои тесты, но не иметь ничего общего с реальным решением проблемы?

Ответы [ 4 ]

5 голосов
/ 06 июня 2010

Общий случай

В общем случае нет. Так как они даже не знают, что вы правильно выполнили тест, ничто из того, что они делают - даже не правильно выполняют домашнее задание - не может гарантировать прохождение теста.

Особые случаи

Если учащиеся могут выполнить ваш тест, они могут использовать алгоритм обучения.

Если учащиеся имеют доступ к исходному коду вашего теста, они могут искать хитрости, такие как использование отражения для получения ожидаемых результатов, хранящихся в переменных. Если они не могут найти какие-либо трюки с исходным кодом, они все равно могут скомпилировать и запустить ваши тесты.

Если учащиеся имеют доступ к байт-коду вашего теста, они могут, вероятно, разобрать его и использовать приемы с исходным кодом. Даже если вы эффективно его запутали, они все равно смогут его запустить.

Если учащиеся знают, что вы тестируете код ученика по сравнению с кодом другого ученика, все, что им нужно сделать, это быть последовательным.

Рекомендации

  1. Не делайте тест доступным для студентов. Они должны самостоятельно проверять свою домашнюю работу. После того, как они предоставят вам домашнее задание для официальной оценки, запустите тесты.
  2. Используйте рандомизацию, чтобы сделать ваши тесты более надежными.
  3. Если ваш тест сравнивает код студента с кодом другого студента, то вам следует вручную исследовать каждый сбой. Может быть, один ученик реализовал правильно, а другие скопировали неверную реализацию. В этом случае большинство правил вознаграждает некомпетентность.
  4. Вы можете собирать их тесты и тестировать их тесты.
1 голос
/ 05 июня 2010

Конечно. Даже без исходного кода для тестов они могут использовать манипулятор байт-кода, такой как ASM , или декомпилятор для сопоставления входных данных и желаемого ответа.

0 голосов
/ 05 июня 2010

Абсолютно .

Если учащиеся узнают, что ищут ваши тесты, они могут написать код, который даст такой результат, не решая проблему домашней работы.

А рефлексия? Да, если вы сохраните ожидаемые результаты в переменных. Я не уверен, что можно читать встроенные константы. Но независимо от этого, запустите их код в песочнице с менеджером безопасности. В любом случае, вы хотите сделать это: что, если их код является вредоносным или имеет непредвиденные последствия?

0 голосов
/ 05 июня 2010

JUnit 4 имеет аннотацию @Ignore, которая используется следующим образом:

@Ignore
@Test
public void testSmth() {
   ...
}

Но я пытаюсь представить ситуацию, которую вы описали. И единственное, о чем я могу сказать, это что-то вроде верификатора проблем ACM (например, PC ^ 2 ).

И если это так, вы вызовете код для тестирования и получите полный контроль над потоком. Таким образом, пользователи не смогут обманывать таким образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...