2010-06-05 7 views
4

Supposons que quelqu'un doive écrire une solution à un problème et que je doive tester sa solution avec quelques tests. Est-il possible (peut-être avec des réflexions ou quelque chose) son programme de passer tous mes tests, mais de n'avoir rien en commun avec la vraie solution au problème?Comment faire passer un test unitaire?

+0

Cela devait arriver. Au lieu d'un étudiant qui triche plus ou moins sur ses devoirs en demandant à ce site, il semble que nous pourrions avoir un assistant d'enseignement à la recherche d'un raccourci pour lire le code de l'étudiant. (S'il vous plait, ne vous offusquez pas, @brain_damage.) – bmargulies

+2

@bmargulies, je sais que mon programme CS nécessite au moins souvent l'utilisation d'une niveleuse automatisée. Donc, même si brain_damage peut être un classificateur, cela ne signifie pas qu'il "triche". Il pourrait juste être curieux. –

+0

@Matt J'ai évité le mot "triche" pour cette raison. – bmargulies

Répondre

5

Cas général

Dans le cas général, non. Comme ils ne savent même pas que vous avez correctement mis en œuvre le test, rien de ce qu'ils font - même pas correctement la mise en œuvre du devoir - ne peut garantir le succès du test.

Cas particuliers

Si les étudiants peuvent exécuter votre test, ils pourraient utiliser un algorithme d'apprentissage. Si les élèves ont accès au code source de votre test, ils peuvent rechercher des astuces comme l'utilisation de la réflexion pour obtenir les résultats attendus stockés dans les variables. S'ils ne peuvent trouver aucune astuces de code source, ils peuvent toujours compiler et exécuter vos tests.

Si les étudiants ont accès au code d'octet de votre test, ils peuvent probablement le désassembler et utiliser des astuces de code source. Même si vous l'observez efficacement, ils peuvent toujours l'exécuter.

Si les élèves savent que vous testez le code de l'élève par rapport à d'autres codes de l'élève, tout ce qu'ils ont à faire est d'être cohérent.

Recommandations

  1. Ne pas faire le test à la disposition des étudiants. Ils devraient tester leurs devoirs de façon indépendante. Après qu'ils ont soumis leurs devoirs à vous pour une évaluation formelle, exécutez les tests.
  2. Utilisez la randomisation pour rendre vos tests plus robustes.
  3. Si votre test compare le code de l'étudiant à celui d'un autre code d'étudiant, vous devez rechercher manuellement chaque échec. Peut-être qu'un étudiant a mis en œuvre correctement et les autres ont copié une implémentation incorrecte. Dans ce cas, les règles de la majorité récompensent l'incompétence.
  4. Vous pouvez collecter leurs tests et tester leurs tests.
+0

Ceci est une bonne réponse. Dans les compétitions de programmation telles que l'ACM-ICPC, les concurrents reçoivent un ou deux cas de test, mais des tests entièrement différents sont utilisés pour tester le code, ceux qui ne sont pas divulgués aux étudiants. Si l'étudiant reçoit tous les cas de test, il peut bien sûr renvoyer ce que vous voulez voir pour l'entrée sans écrire les algorithmes réels, mais en prenant des mesures raisonnables, ceci peut être évité. – JFA

1

Bien sûr. Même sans le code source pour les tests, ils pourraient utiliser un manipulateur de code octet comme ASM ou un décompilateur pour corréler les entrées et la réponse désirée.

0

JUnit 4 a annotation @Ignore, qui est utilisé de cette façon:

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

Mais je suis en train de l'imagerie de la situation que vous avez décrite. Et la seule chose que je peux chose à propos de quelque chose est comme vérificateur de problèmes ACM (comme PC^2).

Et si c'est le cas, vous appellerez le code pour le tester et vous aurez un contrôle total sur le flux. Les utilisateurs n'auront donc pas la possibilité de tricher de cette manière.

0

Absolument. Si les étudiants découvrent ce que vos tests recherchent, ils peuvent écrire du code qui produit ce résultat, sans résoudre le problème de devoirs.

Et la réflexion? Oui, si vous conservez vos résultats attendus dans des variables. Je ne suis pas sûr s'il est possible de lire les constantes en ligne. Mais peu importe, exécutez leur code dans un bac à sable avec un gestionnaire de sécurité. Vous voulez le faire de toute façon: que se passe-t-il si leur code est malveillant ou a des conséquences inattendues?

+0

Ou ils allouent une tonne de pointeurs et ne les libèrent pas parce qu'ils ne sont pas de très bons programmeurs ... – JFA

Questions connexes