python - 使用 Python unittest 测试可以返回不确定结果的函数

标签 python unit-testing testing

我正在用 Python 编写一个小型作业调度程序。可以为调度程序提供一系列可调用项和依赖项,并且应该运行可调用项,确保没有任务在其任何前任之前运行。

我正在尝试遵循测试驱动的方法,但遇到了测试依赖项处理的问题。我的测试代码如下所示:

def test_add_dependency(self):
    """Tasks can be added with dependencies"""
    # TODO: Unreliable test, may work sometimes because by default, task
    #       running order is indeterminate.
    self.done = []
    def test(id):
        self.done.append("Test " + id)
    s = Schedule()
    tA = Task("Test A", partial(test, "A"))
    tB = Task("Test B", partial(test, "B"))
    s.add_task(tA)
    s.add_task(tB)
    s.add_dependency(tA, tB)
    s.run()
    self.assertEqual(self.done, ["Test B", "Test A"])

问题是这个测试(有时)甚至在我添加依赖处理代码之前就已经工作了。这是因为规范没有规定任务必须按特定顺序运行。因此,即使忽略依赖信息,正确的顺序也是一个完全有效的选择。

有没有一种编写测试的方法可以避免这种“意外”成功?在我看来,这是一种相当常见的情况,尤其是在采用测试驱动的“不要在没有失败测试的情况下编写代码”的方法时。

最佳答案

您所处的情况是,每个研究人员都在查看一组不完美的数据,并试图判断关于它的假设是否正确。

如果两次运行的结果不同,那么重新运行多次将为您提供一个样本,您可以对其应用统计数据来确定它是否有效。但是,如果一批运行会给你类似的结果,但不同日期的不同批处理会给你不同的结果,那么你的不确定性取决于程序本身之外的事件,你需要找到一种方法控制它们,最好是让它们最大限度地提高错误算法的几率。

这是非确定性的代价;你必须求助于统计数据,你必须得到正确的统计数据。您需要能够以一定的置信度接受假设,并拒绝原假设。如果可以最大化结果的方差,则需要更少的样本;有不同的 CPU 负载,或 IO 中断,或安排随机休眠的任务。

为了定义一个有值(value)的测试,找出这样一个调度器受到什么影响可能是可取的。

关于python - 使用 Python unittest 测试可以返回不确定结果的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15973256/

相关文章:

python - 使用 BeautifulSoup 根据内容值提取标签内容

python - Django-parler:类型对象 'BookImage' 没有属性 '_parler_meta'

python - 使用 Python 从字符串中提取链接

c# - 如何对在 MVVM 中调用异步方法的 DelegateCommand 进行单元测试

iphone - 如何测试 shouldAutorotateToInterfaceOrientation?

python - Django - 需要一些关于如何实现 ManyToMany 数据库的指导

unit-testing - NUnit 没有运行我的测试用例

ruby-on-rails - 我是否需要在此测试中创建每个对象?

testing - 如何使用 Hound 从选择下拉列表中选择一个选项?

android - 在 android CTS(兼容性测试套件)上获取 "Error during sync. Timeout."错误