• <Unittest学习1> unittest 前置后置和基本方法


    Unittest

      说起python的单元测试,第一反应肯定就会是unittest,unittest作为python的标准库,很优秀,也被广泛的用到各个项目,但是你们知道吗?python的单元测试并不只有这一个,还有个pytest,和nose,后面我们主要通过unittest+python完成我们的自动化框架

    unittest介绍

    unittest单元测试框架最早受到junit(junit是java的单元测试,)的启发,和其他语言的主流单元测试框架有很相似的地方,他支持测试自动化,多个用例共享前置和清理代码,聚合多个测试用例到测试集中,并将测试和报告框架独立

    官方文档:https://docs.python.org/2/library/unittest.html

    unittest方法

    1、TestCase(测试用例):所有的测试用例的基类,一个test case 包括正常执行的用例,其中包括setup(用例的开始),tearDown(用例的结束),以及run(用例的执行器)。

    2、TestSuite(测试套件):多个测试用例的组合就是测试套件,TestSuite可以嵌套TestSuite。

    3、TestLoder:是用来加载 TestCase到TestSuite中,其中有几个loadTestsFrom_()方法,就是从各个地方寻找TestCase,创建他们的实例,然后add到TestSuite中,再返回一个TestSuite实例

    4、TextTestRunner:是来执行测试用例的,其中的run(test)会执行TestSuite/TestCase中的run(result)方法。
    5、TextTestResult:测试结果会保存到TextTestResult实例中,包括运行了多少用例,成功与失败多少等信息;
    6、TestFixture:一个测试用例的初始化准备及环境还原,主要是setUp() 和 setDown()方法;

    unittest使用方法

    对于一些方法的使用,必须要先看一遍源码,源码上写的很清楚的

    复制代码
    import unittest
    
        class IntegerArithmeticTestCase(unittest.TestCase):
            def testAdd(self):  # test method names begin with 'test'  # 测试用例的名称要以test开头
                self.assertEqual((1 + 2), 3)
                self.assertEqual(0 + 1, 1)
            def testMultiply(self):
                self.assertEqual((0 * 10), 0)
                self.assertEqual((5 * 8), 40)
    
        if __name__ == '__main__':
            unittest.main()
    复制代码

    上面的源码中通过继承unittest.TestCase来创建一个测试用例,在这个类中,方法定位都是已test的前缀开头(当然也可以自己进行修改,这个要更改源码,后面进行补充),测试框架将它作为独立的测试去执行,每条用例中也都通过assert的方法进行去断言

    前置和后置

    1、setUp:在写测试用例的时候,这个就是执行用例的前置条件。
    2、tearDown:执行完用例后,为了不影响下一次用例的执行,一般有个数据还原的过程,这就是执行用例的后置条件。
    3、前置和后置都是非必要的条件,如果没有也可以写pass,也可以不写
    5、setUpClass():必须使用@classmethod 装饰器,所有case运行前只运行一次
    6、tearDownClass():必须使用@classmethod装饰器,所有case运行完后只运行一次

    说了这么多,我们动手试试。

    复制代码
    # coding:utf-8
    import unittest
    
    class Test(unittest.TestCase):
        def setUp(self):
            print('这是用例的前置')
    
        def tearDown(self):
            print('这是用例的后置')
    
        def test01(self):
            print('这是第一条用例')
    
        def test02(self):
            print('这是第二条用例')
    
        def test03(self):
            print('这是第三条用例')
    
    if __name__ == '__main__':
        unittest.main()
    复制代码

    发现每执行一条用例,先执行的前置条件,然后执行用例内容,最后执行后置的条件。

    Ran 3 tests in 0.001s 表示执行了3条用例公用了0.01S的时间

    可能我们遇到一些用例,只需要执行1次前置和后置,那么我们可以通过添加装饰器进行执行一次前置

    装饰器源码:

    复制代码
    class classmethod(object):
        """
       classmethod(函数)- >方法
        将函数转换为类方法。
        类方法接收类作为隐式的第一个参数,
      就像实例方法接收实例一样。
      要声明类方法,请使用以下习语:
    丙级:
    @classmethod
    定义f(cls, arg1, arg2,…):
    …
    它可以在类(例如C.f())上调用,也可以在实例上调用
    (例如C () .f ())。除了类之外,实例将被忽略。
    如果为派生类调用类方法,则为派生类
    对象作为隐含的第一个参数传递。
    类方法与c++或Java静态方法不同。
    如果您想要这些,请参阅staticmethod builtin。
        """
        def __get__(self, *args, **kwargs): # real signature unknown
            """ Return an attribute of instance, which is of type owner. """
            pass
    
        def __init__(self, function): # real signature unknown; restored from __doc__
            pass
    
        @staticmethod # known case of __new__
        def __new__(*args, **kwargs): # real signature unknown
            """ Create and return a new object.  See help(type) for accurate signature. """
            pass
    
        __func__ = property(lambda self: object(), lambda self, v: None, lambda self: None)  # default
    
        __isabstractmethod__ = property(lambda self: object(), lambda self, v: None, lambda self: None)  # default
    
    
        __dict__ = None # (!) real value is ''
    复制代码

    代码操作

    复制代码
    # coding:utf-8
    import unittest
    
    class Test(unittest.TestCase):
    @classmethod def setUpClass(self): print('这是用例的前置')
    @classmethod def tearDownClass(self): print('这是用例的后置') def test01(self): print('这是第一条用例') def test02(self): print('这是第二条用例') def test03(self): print('这是第三条用例') if __name__ == '__main__': unittest.main()
    复制代码

    执行结果

    发现只执行了一次前置和一次后置。

    声明 欢迎转载,但请保留文章原始出处:) 博客园:https://www.cnblogs.com/chenxiaomeng/ 如出现转载未声明 将追究法律责任~谢谢合作
  • 相关阅读:
    Junit单元测试
    点餐系统
    文件的横纵转换
    零碎知识--日积月累
    json校验
    程序员必须收藏的14个顶级开发社区!
    管理员权限
    Thinking In Java 读书笔记
    学生考试系统
    JeeSite开发笔记
  • 原文地址:https://www.cnblogs.com/chenxiaomeng/p/14832439.html
Copyright © 2020-2023  润新知