【问题标题】:Remove/overwrite import删除/覆盖导入
【发布时间】:2017-03-07 23:40:35
【问题描述】:

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

我对@9​​87654336@ 包含类和func1func2 是特定类的方法以及func1func2 只是在student.py 中一般定义的情况感兴趣.

【问题讨论】:

  • 我认为用正确的函数替换错误的函数首先是一个糟糕的举动。如果func2 依赖于func1 并且func1 以破坏func2 的方式被破坏,那么学生应该已经注意到func2 在测试中被破坏了。同样,如果他们误解了 func1 的规范并注意到它为时已晚,但他们的所有其他功能都在不正确的 func1 行为下工作,他们不应该在所有内容上都获得积分,因为您将他们的 func1 换成了某些东西他们的其他功能没想到。
  • @user2357112 我同意这不是一个完美的主意,我只是想这样做,因为我们当前用于查找错误的调试方法是用已知的工作代码替换损坏的代码,直到我们找出他们没有的代码'不工作。此外,此脚本根本不用于分配成绩,仅用于协助手动评分(因此,如果他们通过所有测试,则表明一切都很完美,如果只有 func7 失败,也许先看看那里,等等)

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


【解决方案1】:

最简单的方法是将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)

【讨论】:

  • 不起作用;其他函数仍会使用原来的func1
  • 你必须import studentstudent.func1 = correct.func1
  • 是的,你是对的。我忽略了调用 func1 的学生代码的部分。
  • 好的,更好的版本。
  • 我认为 unittest 实际上并没有对测试执行顺序做出任何保证,这似乎依赖于它。
猜你喜欢
  • 2020-07-05
  • 1970-01-01
  • 2019-12-27
  • 2011-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多