Testresources,一个用于管理昂贵测试资源的pyunit扩展
项目描述
testresources:扩展Python unittest,允许测试用例声明式使用资源。
版权所有 (C) 2005-2013 罗伯特·柯林斯 <robertc@robertcollins.net>
用户可选择Apache License,版本2.0或BSD 3-clause许可。项目源代码中包含这两种许可证的副本。除非适用法律要求或书面同意,否则在这些许可证下分发的软件按“原样”基础分发,不提供任何形式(明示或暗示)的保证或条件。请参阅所选许可证的具体语言,了解该许可证下的权限和限制。
除非适用法律要求或书面同意,否则在这些许可证下分发的软件按“原样”基础分发,不提供任何形式(明示或暗示)的保证或条件。请参阅所选许可证的具体语言,了解该许可证下的权限和限制。
有关Testresources的详细许可信息,请参阅COPYING文件。
Testresources
testresources通过提供简洁的API扩展unittest,以便在测试用例需要昂贵的常用资源时提供测试优化 - 例如,VCS系统的示例工作树,企业应用的参考数据库,或Web服务器……想象力无限。
构建/自测依赖项
Python 2.6+(或3.3+)
docutils
testtools(http://pypi.python.org/pypi/testtools/)
fixtures(http://pypi.python.org/pypi/fixtures)
使用testresources的依赖项
Python 2.6+(或3.3+)
对于Python的较旧版本,testresources <= 1.0.0 支持 2.4、2.5 和 3.2。
testresources的工作原理
testresources的基本思想是
测试在 resources 属性中声明它们所需的资源。
当测试运行时,所需的资源对象被分配(无论是新构建的还是重复使用的),并分配给TestCase的属性。
testresources区分“资源管理器”(TestResourceManager 的子类),它充当一种工厂,以及“资源”,它可以是从管理器类的 getResource 方法返回的任何类型的对象。
资源可以是干净的或脏的。干净意味着它们在所有重要方面与一个新构建的实例具有相同的状态,因此可以安全地重复使用。
目前,testresources与setUpClass和setUpModule不兼容 - 当使用这些功能的测试套件被OptimisingTestSuite包装时,结果将被扁平化以进行优化,并且这些设置将完全不会运行。
主要类
testresources.ResourcedTestCase
通过扩展或混合此类,测试可以用自动分配和处置或回收的必要资源。
ResourceTestCase可以用作测试的基础类,当这样做时,测试将自动检查其 resources 属性以获取资源,由OptimisingTestSuite以及它们自己的setUp()和tearDown()方法执行。(这允许测试在没有需要此特定TestSuite作为容器的条件下保持功能)。或者,您可以从自己的类setUp和tearDown中调用setUpResources(self, resources, test_result)和tearDownResources(self, resources, test_result),并将激活相同的行为。
要声明资源的使用,将 resources 属性设置为包含 (attribute_name, resource_manager) 元组的列表。
在setUp期间,对于每个声明的需求,测试将获得一个指向分配资源的属性,这是通过调用 resource_manager.getResource() 得到的。在tearDown()期间将对每个资源调用 finishedWith。
例如
class TestLog(testresources.ResourcedTestCase): resources = [('branch', BzrPopulatedBranch())] def test_log(self): show_log(self.branch, ...)
testresources.TestResourceManager
TestResourceManager 是测试可以用来创建资源的对象。它可以被覆盖以管理不同类型的资源。通常测试代码不需要调用它的任何方法,因为这将由testresources机制安排。
在实现新的 TestResourceManager 子类时,应考虑覆盖以下方法
- make
必须在每个具体子类中覆盖。
返回资源对象的新实例(实际资源,而非TestResourceManager)。无需担心重用,重用将由其他部分处理。此方法仅在确实需要新资源时调用。
make 由 getResource 调用;通常不需要覆盖后者。
- clean
清理现有资源实例,例如删除目录或关闭网络连接。默认情况下,此方法不执行任何操作,这可能适用于自动垃圾回收的资源。
- _reset
将不再使用的脏资源重置为干净状态。默认情况下,这仅丢弃它并创建一个新的,但对于某些资源可能存在重置它们的更快速方法。
- isDirty
检查现有资源是否为脏。默认情况下,这仅报告是否调用了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对象上的resources列表用于声明依赖关系。例如,需要一个临时目录的DatabaseResource可以声明为具有资源列表
class DataBaseResource(TestResourceManager): resources = [("scratchdir", TemporaryDirectoryResource())]
最重要的是,在没有中间调用finishedWith的情况下,对同一TestResourceManager调用两次getResources,只要它不是脏的,就会返回相同的对象。
当测试有依赖项且该依赖项成功完成但返回None时,框架不会将其视为错误:请确保始终返回有效的资源或引发错误。错误处理尚未得到充分实践,但任何此领域的错误都将被迅速处理。
在doc/文件夹中可以找到示例TestResourceManager。
有关详细信息,请参阅pydoc testresources.TestResourceManager。
testresources.GenericResource
将testresources适配到现有资源类。
testresources.FixtureResource
将testresources适配到更简单的fixtures.Fixture API。从长远来看,testresources可能将侧重于该简单API作为编写资源的推荐方法。
testresources.OptimisingTestSuite
此TestSuite将直接检查它持有的所有测试用例,如果它们声明了所需资源,将按尝试最小化所需设置和拆除次数的顺序运行测试。它通过在特定资源使用的测试序列周围调用getResource()和finishedWith()来实现这一点。
正常将测试添加到OptimisingTestSuite。任何标准库TestSuite对象都将被扁平化,而任何自定义TestSuite子类都将分布在它们的成员测试中。这意味着测试套件中的任何自定义逻辑都应得到保留,代价是某些程度的优化。
由于测试套件执行优化,您可以通过向单个OptimisingTestSuite添加更多或更少的测试来控制进行的优化程度。您可以将所有内容添加到单个OptimisingTestSuite中,以实现全局优化,或者可以使用几个较小的OptimisingTestSuites。
testresources.TestLoader
这是一个创建OptimisingTestSuites的简单TestLoader。
unittest.TestResult
testresources将有关资源创建和销毁的活动记录到运行测试时使用的测试结果对象中。查找6个扩展方法:startCleanResource、stopCleanResource、startMakeResource、stopMakeResource、startResetResource和最后是stopResetResource。 testresources.tests.ResultWithResourceExtensions是具有这些方法的TestResult的示例。
控制资源重用
何时或如何标记资源为脏?
最简单的方法是让TestResourceManager.make调用self.dirtied:资源总是立即变脏,并且在没有重置之前不会重用。当底层资源重置或重新创建的成本较低,或者很难检测其是否已变脏或捕获改变它的操作时,这很合适。
或者,重写TestResourceManager.isDirty并检查资源以确定其是否可以安全重用。
最后,您可以为返回的资源安排,使其在第一次对其进行变更操作时回调到TestResourceManager.dirtied。
常见问题解答
我可以在测试方法内部动态请求资源吗?
通常情况下,不应该这样做。其思想是资源被静态声明,以便测试资源可以“平滑”多个测试的资源使用。
但是,您可能能够找到一些静态声明且可重用的对象作为资源,然后在测试期间提供方法生成其子元素。
如果资源在TestResourceManager对象中,并且TestResourceManager通常在测试用例的resources属性中内联构建,那么它们如何在不同测试类之间共享呢?
好问题。
我想您应该安排在适当的模块作用域中保持一个单例,然后由想要共享它的测试类引用它。
释放
在“开发中”之后,将一个部分添加到NEWS中。
git tag -s
python setup.py sdist bdist_wheel upload -s
项目详情
testresources-2.0.1.tar.gz的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | ee9d1982154a1e212d4e4bac6b610800bfb558e4fb853572a827bc14a96e4417 |
|
MD5 | 8873ab443db5569528964f524228a2d7 |
|
BLAKE2b-256 | 9d578e3986cd95a80dd23195f599befa023eb85d031d2d870c47124fa5ccbf06 |
testresources-2.0.1-py2.py3-none-any.whl的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 67a361c3a2412231963b91ab04192209aa91a1aa052f0ab87245dbea889d1282 |
|
MD5 | f30436791c3c6fe92a36c6c1d135d84d |
|
BLAKE2b-256 | 454d79a9a1f71de22fbc6c6433ac135f68d005de72fbe73e2137d2e77da9252c |