Skip to main content

Testresources,一个 pyunit 扩展,用于管理昂贵的测试资源

项目描述

testresources:python unittest 的扩展,允许测试用例声明性地使用资源。

版权所有 (C) 2005-2013 Robert Collins < robertc @ robertcollins >

根据用户选择的 Apache 许可证 2.0 版或 BSD 3 条款许可证获得许可。项目源代码中提供了这两个许可证的副本,即 Apache-2.0 和 BSD。除非遵守这两个许可之一,否则您不得使用此文件。

除非适用法律要求或书面同意,否则根据这些许可分发的软件将按“原样”分发,没有任何明示或暗示的保证或条件。请参阅您选择的许可证,了解该许可证下的特定语言管理权限和限制。

有关 Testresources 许可的完整详细信息,请参阅 COPYING 文件。

测试资源

testresources 使用干净简单的 api 扩展了 unittest,以在测试用例需要昂贵的公共资源的情况下提供测试优化——例如用于 VCS 系统的示例工作树、用于企业应用程序的参考数据库或 Web 服务器……让想象力尽情发挥。

构建/自测的依赖项

使用测试资源的依赖项

  • Python 2.6+(或 3.3+)

对于旧版本的 Python,testresources <= 1.0.0 支持 2.4、2.5 和 3.2。

测试资源如何工作

testresources 的基本思想是:

  • 测试在资源属性中声明他们需要的资源。

  • 当测试运行时,所需的资源对象被分配(新构造的或重用的),并分配给TestCase的属性。

testresources 区分了 充当一种工厂 的“资源管理器”( TestResourceManager的子类)和可以是从管理器类的getResource方法返回的任何类型的对象的“资源”。

资源要么干净,要么脏。干净意味着它们在所有重要方面都与新构建的实例具有相同的状态,因此可以安全地重用它们。

目前,testresources 与 setUpClass 和 setUpModule 不兼容 - 当 OptimisingTestSuite 使用这些功能围绕测试套件进行包装时,结果将被展平以进行优化,并且这些设置根本不会运行。

主要课程

testresources.ResourcedTestCase

通过扩展或混入这个类,测试可以有必要的资源自动分配和处置或回收。

ResourceTestCase 可以用作测试的基类,完成后,测试将通过 OptimisingTestSuite 及其自己的 setUp() 和 tearDown() 方法自动检查其资源属性。(这允许测试保持功能,而不需要这个特定的 TestSuite 作为容器)。或者,您可以从您自己的类 setUp 和 tearDown 中调用 setUpResources(self, resources, test_result) 和 tearDownResources(self, resources, test_result) 并且将激活相同的行为。

要声明资源的使用,请将资源属性设置为(attribute_name, resource_manager)的元组列表。

在设置期间,对于每个声明的需求,测试都会获得一个指向已分配资源的属性,这是调用 resource_manager.getResource()的结果。 在 tearDown() 期间将在每个资源上调用finishedWith 。

例如:

class TestLog(testresources.ResourcedTestCase):

    resources = [('branch', BzrPopulatedBranch())]

    def test_log(self):
        show_log(self.branch, ...)

测试资源.TestResourceManager

TestResourceManager 是测试可以用来创建资源的对象。它可以被覆盖以管理不同类型的资源。通常测试代码不需要调用任何方法,因为这将由 testresources 机器安排。

在实现新的TestResourceManager子类时,您应该考虑覆盖这些方法:

制作

必须在每个具体子类中被覆盖。

返回资源对象的新实例(实际资源,而不是 TestResourceManager)。无需担心重用,这是单独处理的。仅当确实需要新资源时才调用此方法。

makegetResource调用;您通常不需要覆盖后者。

干净的

清理现有资源实例,例如通过删除目录或关闭网络连接。默认情况下,这不会执行任何操作,这可能适用于自动进行垃圾收集的资源。

_重置

将不再使用的脏资源重置为干净状态。默认情况下,这只是丢弃它并创建一个新的,但对于某些资源,可能有一种更快的方法来重置它们。

是脏的

检查现有资源是否脏。默认情况下,这只报告是否调用了TestResourceManager.dirtied或任何依赖资源是脏的。

例如:

class TemporaryDirectoryResource(TestResourceManager):

    def clean(self, resource):
        shutil.rmtree(resource)

    def make(self):
        return tempfile.mkdtemp()

    def isDirty(self, resource):
        # Can't detect when the directory is written to, so assume it
        # can never be reused.  We could list the directory, but that might
        # not catch it being open as a cwd etc.
        return True

TestResourceManager 对象上的资源列表用于声明依赖关系。例如,需要 TemporaryDirectory 的 DataBaseResource 可以用资源列表声明:

class DataBaseResource(TestResourceManager):

    resources = [("scratchdir", TemporaryDirectoryResource())]

最重要的是,同一个 TestResourceManager 的两个 getResources 中间没有finishedWith调用,只要它不脏,就会返回同一个对象。

当一个 Test 有一个依赖并且该依赖成功完成但返回 None 时,框架不会认为这是一个错误:确保总是返回一个有效的资源,或者引发一个错误。错误处理没有被大量使用,但是这方面的任何错误都会得到及时处理。

可以在 doc/ 文件夹中找到示例 TestResourceManager。

有关详细信息,请参阅 pydoc testresources.TestResourceManager。

测试资源.GenericResource

粘合以使 testresources 适应现有的类资源类。

testresources.FixtureResource

胶水使测试资源适应更简单的fixtures.Fixture API。长期的 testresources 可能会巩固更简单的 API 作为编写资源的推荐方法。

testresources.OptimisingTestSuite

此 TestSuite 将内省它直接持有的所有测试用例,如果它们声明了所需的资源,则将按照尝试最小化所需设置和拆卸次数的顺序运行测试。它试图通过围绕使用特定资源的测试序列调用 getResource() 和 finishedWith() 来实现这一点。

测试正常添加到 OptimisingTestSuite。任何标准库 TestSuite 对象都将被展平,而任何自定义 TestSuite 子类将分布在其成员测试中。这意味着应该保留测试套件中的任何自定义逻辑,代价是某种程度的优化。

因为测试套件会进行优化,所以您可以通过向单个 OptimisingTestSuite 添加更多或更少的测试来控制发生的优化量。您可以将所有内容添加到单个 OptimisingTestSuite,获得全局优化,或者您可以使用几个较小的 OptimisingTestSuite。

测试资源.TestLoader

这是一个简单的 TestLoader,默认创建 OptimisingTestSuites。

unittest.TestResult

testresources 会将有关资源创建和销毁的活动记录到运行对象测试的结果中。寻找 6 个扩展方法: startCleanResourcestopCleanResourcestartMakeResourcestopMakeResourcestartResetResource和最后stopResetResourcetestresources.tests.ResultWithResourceExtensions是存在这些方法的TestResult示例。

控制资源重用

何时或如何将资源标记为脏?

最简单的方法是让TestResourceManager.make调用self.dirtied:资源总是立即变脏,并且在没有首先被重置的情况下永远不会被重用。当底层资源的重置或重新创建成本很低,或者很难检测它是否已被污染或难以捕获更改它的操作时,这是合适的。

或者,覆盖TestResourceManager.isDirty并检查资源以查看它是否可以安全地重用。

最后,您可以安排返回的资源在第一个对其进行变异的操作时始终回调到 TestResourceManager.dirtied

常问问题

  • 我可以在测试方法中动态请求资源吗?

    一般来说,不,你不应该这样做。这个想法是资源是静态声明的,因此 testresources 可以在多个测试中“平滑”资源使用。

    但是,您可能会找到一些静态声明且可重用的对象作为资源,然后可以提供方法在测试期间生成其自身的子元素。

  • 如果资源保存在 TestResourceManager 对象中,并且 TestResourceManager 通常是在测试用例 资源属性中内联构造的,那么它们如何在不同的测试类之间共享?

    好问题。

    我想您应该安排将单个实例保存在适当的模块范围内,然后由想要共享它的测试类引用。

释放

  1. 向 NEWS 添加一个部分(在开发中之后)。

  2. git标签-s

  3. python setup.py sdist bdist_wheel 上传 -s

下载文件

下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。

源分布

testresources-2.0.1.tar.gz (41.9 kB 查看哈希

已上传 source

内置分布

testresources-2.0.1-py2.py3-none-any.whl (36.5 kB 查看哈希

已上传 2 7