Python 删除/覆盖导入

Python 删除/覆盖导入,python,python-3.x,unit-testing,Python,Python 3.x,Unit Testing,我正在尝试使用unittest为intro CS类设置评分脚本。本质上,学生提交一个python文件student.py,其中包含一些通常相互依赖的函数(这意味着func3()可以在计算中使用func1()) 我通过比较student.func1的输出与correct.func1的输出来编写每个方法的单元测试,这是一种已知的正确实现方法(来自文件correct.py) 例如,假设func2在其计算中使用func1。 因此,无论是在默认情况下还是在student.func1测试失败时,我都想用co

我正在尝试使用
unittest
为intro 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中“取消导入”模块,并且到目前为止还没有找到任何关于它的资源


我对两种情况都感兴趣,
student.py
包含类,
func1
func2
是特定类的方法,并且当
func1
func2
只是在
student.py
中一般定义时,最简单的方法是将
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)
下面是一个失败/有效的dummy 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)

首先,我认为用正确的函数替换错误的函数是一个糟糕的举动。如果
func2
依赖于
func1
,并且
func1
以破坏
func2
的方式被破坏,那么学生应该注意到
func2
在测试中被破坏。类似地,如果他们误解了
func1
的规范并注意到它太晚了,但是他们的所有其他函数都使用了不正确的
func1
行为,他们不应该因为你把他们的
func1
换成了其他函数所没有想到的东西而在所有东西上都扣分数。@user2357112我同意这不是一个完美的主意,我只是想这样做,因为我们目前发现错误的调试方法是用已知的工作代码替换损坏的代码,直到我们发现他们的哪些代码不工作为止。此外,这个脚本根本不是用来分配分数的,只是用来帮助手工评分(因此,如果他们通过了所有测试,就很好地表明一切都很完美,如果
func7
失败,可能先看一下,等等)不起作用;其他函数仍将使用原始的
func1
。您必须
import student
student.func1=正确。func1
。是的,您是对的。我忽略了学生代码调用func1的部分。好的,更好的版本。我不认为unittest实际上对测试执行顺序有任何保证,这似乎依赖于此。