删除/覆盖导入

时间:2017-03-07 23:40:36

标签: python python-3.x unit-testing

我正在尝试使用unittest为介绍CS类设置评分脚本。从本质上讲,学生提交了一个python文件student.py,其中包含一些通常相互依赖的函数(意味着func3()可能在其计算中使用func1())。

我正在为每个方法编写单元测试,方法是将student.func1的输出与correct.func1的输出进行比较,这是一种已知正确实现的方法(来自文件correct.py )。

例如,假设func2在其计算中使用func1。 因此,默认情况下或student.func1未通过某些测试时,我想用student.func1覆盖correct.func1,因此student.func2使用已知的正确实现(因此不仅仅是默认是错的)。我怎么能这样做呢?似乎setUp()tearDown()与我想要的类似,但我不知道如何在python中“unmport”模块,到目前为止还没有找到任何关于它的资源。 / p>

我对student.py包含类,func1func2是特定类的方法以及func1和{{1}的情况感兴趣只是在func2内定义。

1 个答案:

答案 0 :(得分: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)