2017-03-07 155 views
3

我正在嘗試使用unittest設置介紹CS類的評分腳本。實質上,學生提交一個python文件student.py,它有一些通常相互依賴的函數(意思是func3()可能在其計算中使用func1())。刪除/覆蓋導入

我通過student.func1輸出比較的correct.func1輸出,這是已知的正確執行(從文件correct.py)的方法寫的每一個方法的單元測試。

作爲一個例子,說func2在它的計算中使用func1。 因此,無論是默認還是student.func1都沒有通過一些測試,我想用correct.func1覆蓋student.func1,所以student.func2使用了一個已知的正確實現(因此默認情況下不僅僅是錯誤的)。我怎麼能這樣做呢?它看起來像setUp()tearDown()是類似於我想要的,但我不知道如何在Python中「unimport」模塊,到目前爲止還沒有找到任何有關它的資源。

我很感興趣,雙方的情況下student.py含有類,func1func2是一類特殊的方法,以及當func1func2student.py只是定義一般。

+0

我認爲用正確的函數替換錯誤的函數是一個不好的舉動。如果'func2'依賴'func1'並且'func1'以打破'func2'的方式被破壞,那麼學生應該注意到'func2'在測試中被破壞了。同樣,如果他們錯誤地解釋了'func1'的規範並且注意到它太遲了,但是其他所有函數都與不正確的'func1'行爲一起工作,他們不應該因爲將func1換出他們的其他職能沒有想到。 – user2357112

+0

@ user2357112我同意這不是一個完美的想法,我只是想這樣做,因爲我們目前的查找錯誤的調試方法是用已知的工作代碼替換破碎的代碼,直到我們發現它們沒有工作。另外,這個腳本並不是用於分配等級,而僅僅是爲了協助手動評分(所以如果他們通過了所有測試,那麼一切都很完美,只要'func7'失敗,可能先看那裏等等)。 – Mark

回答

3

最簡單的方法是導入student到您的模塊,再搭上一個AssertionError如果測試失敗,更換學生模塊內部的惡意代碼用自己良好的代碼:

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) 

這裏有一個假student.py失敗/工作:

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

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

當我跑,我得到:

$ 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

不起作用;其他函數仍然會使用原來的'func1'。 – user2357112

+0

你必須'輸入student'和'student.func1 = correct.func1'。 –

+0

是的,你說得對。我掩飾了學生代碼調用func1的部分。 –