将测试夹具组织成层

注解

0.4版新增功能

与测试级、类级和模块级夹具相比,层允许更灵活地组织测试夹具。Nose2中的层是受Zope的TestRunner使用的层的启发并旨在与之兼容。

使用层,可以执行以下操作:

  • 通过在包中的所有测试用例之间共享一个层来实现包级别的设备。

  • 在不同模块的测试之间共享设备,而不让它们运行多次。

  • 创建一个深度超过三个级别(测试、类和模块)的fixture树。

  • 使固定装置可供其他包装或项目使用。

层是一个 new-style 实现至少一个 setUp 分类方法:

class Layer(object):
   @classmethod
   def setUp(cls):
       # ...

它也可以实现 tearDowntestSetUptestTearDown ,全部作为类方法。

要将层分配给测试用例,请设置测试用例的 layer 财产:

class Test(unittest.TestCase):
    layer = Layer

注意这层 已分配,而不是该层的实例。通常不实例化层类。

子层

层可以是其他层的子类:

class SubLayer(Layer):
    @classmethod
    def setUp(cls):
        # ...

在这种情况下,属于子层的所有测试也属于基础层。例如,对于这个测试用例:

class SubTest(unittest.TestCase):
    layer = SubLayer

这个 setUp 方法从 both SubLayerLayer 将在运行任何测试之前运行。超类的设置将始终在子类的设置之前运行。为了 teardown ,相反:子类的 teardown 在超类之前运行。

警告

需要注意的一个重要事项是:子类化其他层的层 不能 叫他们的超类 setUptearDown 等等。测试运行程序将负责组织测试,以便按正确的顺序调用超类的方法:

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.cfgnose2.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

向测试报告添加层信息

插件类引用:layerReporter

class nose2.plugins.layers.LayerReporter(*args, **kwargs)[源代码]

插件类引用:层

class nose2.plugins.layers.Layers(*args, **kwargs)[源代码]