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 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)。无需担心重用,这是单独处理的。仅当确实需要新资源时才调用此方法。
make由getResource调用;您通常不需要覆盖后者。
- 干净的
清理现有资源实例,例如通过删除目录或关闭网络连接。默认情况下,这不会执行任何操作,这可能适用于自动进行垃圾收集的资源。
- _重置
将不再使用的脏资源重置为干净状态。默认情况下,这只是丢弃它并创建一个新的,但对于某些资源,可能有一种更快的方法来重置它们。
- 是脏的
检查现有资源是否脏。默认情况下,这只报告是否调用了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 个扩展方法: startCleanResource、stopCleanResource、startMakeResource、 stopMakeResource、startResetResource和最后stopResetResource。 testresources.tests.ResultWithResourceExtensions是存在这些方法的TestResult示例。
控制资源重用
何时或如何将资源标记为脏?
最简单的方法是让TestResourceManager.make调用self.dirtied:资源总是立即变脏,并且在没有首先被重置的情况下永远不会被重用。当底层资源的重置或重新创建成本很低,或者很难检测它是否已被污染或难以捕获更改它的操作时,这是合适的。
或者,覆盖TestResourceManager.isDirty并检查资源以查看它是否可以安全地重用。
最后,您可以安排返回的资源在第一个对其进行变异的操作时始终回调到 TestResourceManager.dirtied。
常问问题
我可以在测试方法中动态请求资源吗?
一般来说,不,你不应该这样做。这个想法是资源是静态声明的,因此 testresources 可以在多个测试中“平滑”资源使用。
但是,您可能会找到一些静态声明且可重用的对象作为资源,然后可以提供方法在测试期间生成其自身的子元素。
如果资源保存在 TestResourceManager 对象中,并且 TestResourceManager 通常是在测试用例 资源属性中内联构造的,那么它们如何在不同的测试类之间共享?
好问题。
我想您应该安排将单个实例保存在适当的模块范围内,然后由想要共享它的测试类引用。
释放
向 NEWS 添加一个部分(在开发中之后)。
git标签-s
python setup.py sdist bdist_wheel 上传 -s
项目详情
下载文件
下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。
源分布
内置分布
testresources -2.0.1.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | ee9d1982154a1e212d4e4bac6b610800bfb558e4fb853572a827bc14a96e4417 |
|
MD5 | 8873ab443db5569528964f524228a2d7 |
|
布莱克2-256 | 9d578e3986cd95a80dd23195f599befa023eb85d031d2d870c47124fa5ccbf06 |
testresources -2.0.1-py2.py3-none-any.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 67a361c3a2412231963b91ab04192209aa91a1aa052f0ab87245dbea889d1282 |
|
MD5 | f30436791c3c6fe92a36c6c1d135d84d |
|
布莱克2-256 | 454d79a9a1f71de22fbc6c6433ac135f68d005de72fbe73e2137d2e77da9252c |