2017-03-07 2 views
3

J'essaie de configurer un script de notation pour une classe CS intro en utilisant unittest. Essentiellement, les étudiants soumettent un fichier python student.py, qui a un certain nombre de fonctions qui sont généralement interdépendantes (ce qui signifie que func3() peut utiliser func1() dans ses calculs).Supprimer/remplacer l'importation

J'écris des tests unitaires pour chaque méthode en comparant la sortie de student.func1 à la sortie de correct.func1, une méthode qui est connue pour être la mise en œuvre correcte (à partir d'un fichier correct.py).

À titre d'exemple, disons que func2 utilise func1 dans son calcul. Donc, soit par défaut ou sur student.func1 échouant à un test, je veux écraser student.func1 avec correct.func1, alors student.func2 utilise une implémentation correcte connue (et n'est donc pas seulement faux par défaut). Comment pourrais-je faire ça? Il semble que les setUp() et tearDown() sont similaires à ce que je veux, mais je ne sais pas comment "désimporter" des modules en python, et je n'ai trouvé aucune ressource à ce sujet.

Je suis intéressé à la fois le cas où student.py contient des classes et func1, func2 sont des méthodes d'une classe spécifique, et quand func1 et func2 sont définis génériquement juste dans les student.py.

+0

Je dirais que remplacer les mauvaises fonctions par des fonctions correctes est une mauvaise chose en premier lieu. Si 'func2' repose sur' func1' et 'func1' est cassé d'une manière qui casse' func2', alors les étudiants devraient avoir remarqué que 'func2' a été cassé dans testing. De même, s'ils ont mal interprété la spécification de 'func1' et l'ont remarqué trop tard, mais que toutes leurs autres fonctions fonctionnent avec le comportement incorrect' func1', ils ne devraient pas avoir de points sur tout parce que vous avez remplacé leur fonction 'func1' par quelque chose leurs autres fonctions ne s'attendaient pas. – user2357112

+0

@ user2357112 Je suis d'accord que ce n'est pas une idée parfaite, je pensais juste de le faire comme notre méthode de débogage pour trouver des erreurs est de remplacer le code brisé avec le code de travail connu jusqu'à ce que nous découvrons ce qui ne fonctionne pas. De plus, ce script ne sert pas à attribuer des notes, seulement pour aider à la notation manuelle (donc si tous les tests réussissent, tout indique que tout est parfait, si seulement func7' échoue, peut-être y chercher d'abord, etc.) – Mark

Répondre

3

La façon la plus simple serait d'importer student dans votre module, puis prendre un AssertionError si un test échoue, et remplacer le mauvais code à l'intérieur du module étudiant avec votre propre bon code:

import student 

import unittest 

def safe_f1(): 
    print("Safe f1") 
    return 1 

class TestSomething(unittest.TestCase): 

    def test_f1(self): 
     try: 
      self.assertEqual(student.func1(), 1) 
     except AssertionError: 
      student.func1 = safe_f1 
      raise 


    def test_f2(self): 
     self.assertEqual(student.func2(), 2) 

est ici un mannequin student.py qui ne/fonctionne:

def func1(): 
    print("Bad f1") 
    return 2 

def func2(): 
    return func1() + 1 
    return 2 

Quand je cours, j'obtiens:

$ python -m unittest test.py 
Bad f1 
FSafe f1 
. 
====================================================================== 
FAIL: test_f1 (test.TestSomething) 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
    File "/Users/austin/Code/so/test.py", line 13, in test_f1 
    self.assertEqual(student.func1(), 1) 
AssertionError: 2 != 1 

---------------------------------------------------------------------- 
Ran 2 tests in 0.001s 

FAILED (failures=1) 
+0

Ne fonctionne pas; les autres fonctions utiliseront toujours l'original 'func1'. – user2357112

+0

Vous devez 'importer student' et' student.func1 = correct.func1'. –

+0

Oui, vous avez raison. J'ai glissé sur la partie où c'est le code étudiant appelant func1. –