zoukankan      html  css  js  c++  java
  • python 测试框架之---testtools

    在tempest框架中,使用的是testtools为基础框架来运行接口自动化

    一、初识

    testools是属于python中诸多自动化框架中的一个,官方文档如下:

    http://testtools.readthedocs.io/en/latest/overview.html

    但是,官方中的例子还有一个myproject基础文件,让很多同学很困惑,下面我们看看使用testtool最简单的框架,如下

    from testtools import TestCase
    
    
    class TestLearnTesttools(TestCase):
    
        def setUp(self):
            super(TestLearnTesttools, self).setUp()
            print "this is setUp"
    
        def test_case_1(self):
            self.assertIn('a', 'cat')
    
        def test_case_2(self):
            assert 2 == 3
    
        def tearDown(self):
            super(TestLearnTesttools, self).tearDown()
            print "this is tearDown"
    
        @classmethod
        def setUpClass(cls):
            print "this is setUp class"

    注意,setUp必须写super,不然会报如下错误

    TestCase.setUp was not called. Have you upcalled all the way up the hierarchy fr
    om your setUp? e.g. Call super(TestLearnTesttools, self).setUp() from your setUp
    ().

    不然你就不要写setUp,这点感觉这个框架好奇葩...

    运行结果如下:

    E:workspace	est_case>python -m testtools.run testtools_learn.py
    Tests running...
    this is setUp class
    this is setUp
    this is tearDown
    this is setUp
    this is tearDown
    ======================================================================
    FAIL: testtools_learn.TestLearnTesttools.test_case_2
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "testtools_learn.py", line 22, in test_case_2
        assert 2==3
    AssertionError
    
    Ran 2 tests in 0.005s
    FAILED (failures=1)

    在官网中,testtool可以使用很多种方式来运行,直接贴过来吧

    那下面我们用nose来运行一下看看:

    E:workspace	est_case>nosetests -s -v testtools_learn.py
    ALL starting...
    this is setUp class
    test_case.testtools_learn.TestLearnTesttools.test_case_1 ... this is setUp
    this is tearDown
    ok
    test_case.testtools_learn.TestLearnTesttools.test_case_2 ... this is setUp
    this is tearDown
    FAIL
    
    ======================================================================
    FAIL: test_case.testtools_learn.TestLearnTesttools.test_case_2
    ----------------------------------------------------------------------
    _StringException: Traceback (most recent call last):
      File "E:workspace
    osetest_lear	est_case	esttools_learn.py", line 22, in te
    st_case_2
        assert 2==3
    AssertionError
    
    
    ----------------------------------------------------------------------
    Ran 2 tests in 0.012s
    
    FAILED (failures=1)

    感觉还是nose的格式好看。

    二、了解

    既然知道testtool是怎么写及怎么运行了,我们来仔细看看,testtools到底是个什么东东

    还是看官网,可以得知道,testtools是python标准库中unittest的扩展,从testtools源码中可以看到,继承的还是unittest2.TestCase

    class TestCase(unittest.TestCase):
        """Extensions to the basic TestCase.
    
        :ivar exception_handlers: Exceptions to catch from setUp, runTest and
            tearDown. This list is able to be modified at any time and consists of
            (exception_class, handler(case, result, exception_value)) pairs.
        :ivar force_failure: Force testtools.RunTest to fail the test after the
            test has completed.
        :cvar run_tests_with: A factory to make the ``RunTest`` to run tests with.
            Defaults to ``RunTest``.  The factory is expected to take a test case
            and an optional list of exception handlers.
        """
    
        skipException = TestSkipped
    
        run_tests_with = RunTest
    View Code

    至于为什么要使用Testtools,官网上也说了,

    1、有更好的断言方式

    testtool加了assertInassertIsassertIsInstance及其它的。

    虽然unittest标准库中也有这3个方式,但这3个方式是python 2.7之后才有的

    具体testtool的断言优化可以到这里testtools.assertions查询

    特别用法举例,来源网上

    assertThat

    def test_abs(self):
        result = abs(-7)
        self.assertEqual(result, 7)
        self.assertNotEqual(result, 7)
        self.assertThat(result, testtools.matchers.Equals(7))
        self.assertThat(result, testtools.matchers.Not(Equals(8)))

    expectFailure

    def test_expect_failure_example(self):
        self.expectFailure(
            "cats should be dogs", self.assertEqual, 'cats''dogs')

    2、更多调试手段

    在测试过程中,如果你想得到更多的错误信息,可以使用TestCase.addDetail

    TestCase.addDetail具体使用这里不写,感觉没用

    3、fixtures

    测试用例一般都包含一个 setUp 方法来准备测试环境,主要是生成一些测试过程中

    会用到的变量与对象。有时候我们会需要在不同的测试用例间共享这些变量与对象,避免

    在每一个测试用例中重复定义。所以就有了 fixtures,它制定了一套规范,将测试代码与

    环境准备代码分离开来,使得测试代码亦可方便的组织和扩展。

    class SomeTest(TestCase):
        def setUp(self):
            super(SomeTest, self).setUp()
            self.server = self.useFixture(Server())

    4、Skipping tests

    检测到环境不符合要求的情况下,忽略某些测试

    def test_make_symlink(self):
        symlink = getattr(os, 'symlink', None)
        if symlink is None:
            self.skipTest("No symlink support")
        symlink(whatever, something_else)

    5、Test attributes

    标签,与nose框架中的attr一样的道理,testtool中同样支持,使用时使用的参数是--load-list

    from testtools.testcase import attr, WithAttributes
    
    class AnnotatedTests(WithAttributes, TestCase):
    
        @attr('simple')
        def test_one(self):
            pass
    
        @attr('more', 'than', 'one')
        def test_two(self):
            pass
    
        @attr('or')
        @attr('stacked')
        def test_three(self):
            pass

    6、自定义的错误输入

    self.exception_handlers.insert(-1, (ExceptionClass, handler)).

    这样,在任何一个setUp teardown或测试用例中raise ExceptionClass都会调用

    更多的用法请查阅framework folk

  • 相关阅读:
    小师妹学JVM之:JDK14中JVM的性能优化
    小师妹学JVM之:深入理解JIT和编译优化-你看不懂系列
    小师妹学JVM之:GC的垃圾回收算法
    小师妹学JVM之:JVM的架构和执行过程
    小师妹学JavaIO之:用Selector来发好人卡
    小师妹学JavaIO之:NIO中那些奇怪的Buffer
    小师妹学JavaIO之:MappedByteBuffer多大的文件我都装得下
    小师妹学JavaIO之:NIO中Channel的妙用
    小师妹学JavaIO之:Buffer和Buff
    小师妹学JavaIO之:文件File和路径Path
  • 原文地址:https://www.cnblogs.com/landhu/p/6770080.html
Copyright © 2011-2022 走看看