将测试夹具组织成层
备注
0.4版新增功能
与测试级、类级和模块级夹具相比,层允许更灵活地组织测试夹具。Nose2中的层是受Zope的TestRunner使用的层的启发并旨在与之兼容。
使用层,可以执行以下操作:
通过在包中的所有测试用例之间共享一个层来实现包级别的设备。
在不同模块的测试之间共享设备,而不让它们运行多次。
创建一个深度超过三个级别(测试、类和模块)的fixture树。
使固定装置可供其他包装或项目使用。
层是一个 new-style 实现至少一个 setUp
分类方法:
class Layer(object):
@classmethod
def setUp(cls):
# ...
它也可以实现 tearDown
, testSetUp
和 testTearDown
,全部作为类方法。
要将层分配给测试用例,请设置测试用例的 layer
财产:
class Test(unittest.TestCase):
layer = Layer
注意这层 类 已分配,而不是该层的实例。通常不实例化层类。
子层
层可以是其他层的子类:
class SubLayer(Layer):
@classmethod
def setUp(cls):
# ...
在这种情况下,属于子层的所有测试也属于基础层。例如,对于这个测试用例:
class SubTest(unittest.TestCase):
layer = SubLayer
这个 setUp
方法从 both SubLayer
和 Layer
将在运行任何测试之前运行。超类的设置将始终在子类的设置之前运行。为了 teardown
,相反:子类的 teardown
在超类之前运行。
警告
需要注意的一个重要事项是:子类化其他层的层 不能 叫他们的超类 setUp
, tearDown
等等。测试运行程序将负责组织测试,以便按正确的顺序调用超类的方法:
Layer.setUp ->
SubLayer.setUp ->
Layer.testSetUp ->
SubLayer.testSetUp ->
TestCase.setUp
TestCase.run
TestCase.tearDown
SubLayer.testTearDown <-
Layer.testTearDown <-
SubLayer.tearDown <-
Layer.tearDown <-
如果一个子层直接调用它的超类方法, 这些方法将被调用两次 .
层方法参考
- class Layer
不是实际的类,但方法层的参考文档可以实现。没有层基类。层必须是的子类
object
或其他层。- classmethod setUp(cls)
层的
setUp
在执行属于该层的任何测试之前调用方法。如果没有测试属于层(或其子层之一),则setUp
将不调用方法。
- classmethod tearDown(cls)
层的
tearDown
如果层的setUp
方法被调用,未引发异常。如果层没有setUp
方法,或者如果该方法未运行或引发了异常。
- classmethod testSetUp(cls[, test])
层的
testSetUp
方法在属于层(及其子层)的每个测试之前调用。如果该方法被定义为接受参数,则测试用例实例将传递给该方法。方法也可以定义为不带参数。
- classmethod testTearDown(cls[, test])
层的
testTearDown
如果层还定义了setUpTest
方法和该方法已为此测试用例成功运行(未引发异常)。
层DSL
nose2包括一个DSL,用于使用称为“such”的测试设置层。在这里阅读所有相关信息: 例如:功能测试友好的DSL .
漂亮的报告
层插件模块包括第二个插件,用于更改测试报告输出,以使层分组更加清晰。当用激活时 --layer-reporter
命令行选项(或通过配置文件),通常如下所示的测试输出:
test (test_layers.NoLayer) ... ok
test (test_layers.Outer) ... ok
test (test_layers.InnerD) ... ok
test (test_layers.InnerA) ... ok
test (test_layers.InnerA_1) ... ok
test (test_layers.InnerB_1) ... ok
test (test_layers.InnerC) ... ok
test2 (test_layers.InnerC) ... ok
----------------------------------------------------------------------
Ran 8 tests in 0.001s
OK
会变成这样:
test (test_layers.NoLayer) ... ok
Base
test (test_layers.Outer) ... ok
LayerD
test (test_layers.InnerD) ... ok
LayerA
test (test_layers.InnerA) ... ok
LayerB
LayerC
test (test_layers.InnerC) ... ok
test2 (test_layers.InnerC) ... ok
LayerB_1
test (test_layers.InnerB_1) ... ok
LayerA_1
test (test_layers.InnerA_1) ... ok
----------------------------------------------------------------------
Ran 8 tests in 0.002s
OK
layer reporter插件还可以选择对用定义的测试的输出中的关键字(默认情况下为“a”、“having”和“should”)着色。 such DSL .
如果要更改层的显示方式,请设置 description
属性。
class LayerD(Layer):
description = '*** This is a very important custom layer description ***'
现在输出如下:
test (test_layers.NoLayer) ... ok
Base
test (test_layers.Outer) ... ok
*** This is a very important custom layer description ***
test (test_layers.InnerD) ... ok
LayerA
test (test_layers.InnerA) ... ok
LayerB
LayerC
test (test_layers.InnerC) ... ok
test2 (test_layers.InnerC) ... ok
LayerB_1
test (test_layers.InnerB_1) ... ok
LayerA_1
test (test_layers.InnerA_1) ... ok
----------------------------------------------------------------------
Ran 8 tests in 0.002s
OK
警告和警告
测试用例顺序和模块隔离
使用层的测试用例不会以与不使用层的测试用例相同的顺序执行。为了有效地执行层,测试运行程序必须重新组织 all 在加载的测试套件中进行测试,将具有相似层的测试分组在一起(以及父级下的子层)。如果跨模块共享层,这可能会导致一个模块的测试与另一个模块的测试交错执行。
混合层 setUpClass
和模块夹具
不要过河。
UnitTest2中类和模块级设备的实现依赖于对 unittest.TestSuite
. 既然套房 layers
插件用于组织测试派生自 unittest.BaseTestSuite
而不是 unittest.TestSuite
)类和模块级的fixture将被忽略。
混合层和多进程测试
在初始版本中, 使用层的测试套件与多进程插件不兼容 . 这应该在将来的版本中修复。
插件引用
启用此插件
此插件是内置的,但默认情况下不加载。
即使您指定 always-on = True
在配置中,除非您也启用它,否则它不会运行。您可以通过将以下内容放入 unittest.cfg
或 nose2.cfg
文件
[unittest]
plugins = nose2.plugins.layers
这个 plugins
参数可以包含插件名称列表,包括 nose2.plugins.layers
配置 [layer-reporter]
- always-on
- 违约:
假
- 类型:
布尔
- colors
- 违约:
假
- 类型:
布尔
- highlight-words
- 违约:
[“a”、“having”、“should”]
- 类型:
列表
- indent
- 违约:
- 类型:
STR
示例配置
默认配置相当于在 unittest.cfg
文件。
[layer-reporter]
always-on = False
colors = False
highlight-words = A
having
should
indent =
命令行选项
- --layer-reporter DEFAULT
向测试报告添加层信息