pytest自动化测试框架

1:Pytest框架简介:

  接口测试方案:python

    一:工具类:纯手工测试,用工具来做(postman jemeter soapui)--入门简单,不好扩展(后面很多框架定制化)
    二:代码类:现成的python框架:unitest(单元测试比较多,最原始的解释器自带的,不需要安装,不支持定制化,分布式) pytest(高级,效率高,支持定制化) nose
      rf(报告篇评论,需要学会--封装关键字)
      pytest和nose都是unitest扩展的更高级的一个库,框架,基于unitest
    三:测试平台:现成平台,公司自己定制开发的,不对外 (融合jmeter,)  综合平台
      前端
      后端
      执行机制----框架pytest(一般融合了禅道,框架,邮件各种功能

  pytest是python的第三方单元测试框架,可以做系统测试,比unitest更简洁和高效,支持315种以上的插件

  同时兼容unittest框架,在unittest框架迁移到pytest框架的代码不需要重写代码
  unittest框架迁移到pytest框架的时候不需要重写代码
  纯python代码自动化测试框架

pytest对比unitest框架的优势:高级,效率高,支持定制化,支持分布式,支持315种以上的丰富插件,还能向下兼容unitest

2:pytest框架环境搭建:

  pip pytest               安装pytest
  pip install pytest-html            安装原生态报告模板--自带的(有点垃圾
  required-by: pytest-xdist(分布式测试), pytest-Metadata, pytest-html, pytest-forked, allure-pytest
  100个接口用例,正常是一个个用例跑,时间很长,
  分布式-多个业务用例多条线来跑,提高效率(分布式设计用例---分布式逻辑设计,不要出现耦合,关联性太强的东西,否则会等待的)

3:pytets执行测试用例

  设计测试用例时候注意点(必须遵循的规则,否者不识别):

    1:.py测试文件必须以test(test_xxx)开头(或者以_test结尾)
    2:测试类必须以Test开头,并且不能有init方法-----测试类Test开头
    3:测试方法必须以test_开头
    4:断言必须使用assert

4:一般做项目是新建package包的 

  项目文件
    lib库文件    (登录接口源代码,其他接口公共的类,封装的库,登录的,订单的)(包)
    data文件    (参数化数据,excel文件,yaml文件,csv文件---测试文件,用例,文档)(可以是普通文件夹)
    test_case文件  (放测试用例的 )(包)
      test_func01.py(测试用例,写的最好见名知意)
    report文件    (存放测试报告的普通文件夹)
    config      (配置文件

5:pytest函数级别

  函数级别的测试用例必须test_开头:如下test_tc01,test_tc02两个测试用例

    import pytest
    def test_tc01():    #定义函数类型测试用例  
        assert 1+1==2    #断言
    def test_tc02():
        assert 1+1==3    #断言

    if __name__ == '__main__':
        pytest.main(["test_func01.py"])        #我主动运行我的pytest框架(自动调用所有的test测试函数,按照顺序依次运行,test开头的用例自动识别)

6:pytest类级别(工作一般以类位单元,一个模块一个类,登录类,订单类,购物类)

  类级别的测试l类必须以Test开头,并且类李不能有init方法,类里面的函数都是test_开头

  封装好函数和类就行,其他的交给框架,设置好,框架帮你自动组织怎么运行

  封装为了分层,后面更好维护,代码结构整洁

import pytest

class Test_login():              #登录模块的测试类
  def test_login01(self):
	print("---test_login01----")
	assert 1 + 1 == 2
  def test_login02(self):
	print("---test_login02----")
	assert 1 + 1 == 3
if __name__ == '__main__':
  pytest.main(["test_func01.py","-s"])  #框架自己调用函数  需要打印对应的信息,需要在列表里面加-s

7:pytest前置和后置条件:setup_class:类里面类级别的初始化,teardown

  pytest初始化和前置条件,很多接口用例本身需要初始化,初始化分为很多层,

  可以在整个外面做,也可以在里面做,测试类的初始化可以在类里面定义

    import pytest
    class Test_login():            #登录模块的测试类
        #该测试类---有个前置的操作(初始化)
        def setup_class(self):      #类级别的初始化--可选项
            #一个项目,先登录,再购物,登录就是购物类的前置条件,可以放在setup_class里面
            print("执行测试类之前,我需要执行操作")

        def test_login01(self):
            print("---test_login01----")
            assert 1 + 1 == 2
        def test_login02(self):
            print("---test_login02----")
            assert 1 + 1 == 3

        def teardown(self):            #看业务本身需不需要初始化和清除环境,--可选项
            print("------该测试类的环境清除-----")

    if __name__ == '__main__':
        pytest.main(["test_func01.py","-s"]) 

8:pyets种有四种级别的setup和teardown:

  1:setup_module和teardown_module,在整个测试用例所在的文件中所在的文件中所有的方法运行前和运行后运行,只运行一次---模块的
  1:setup_class和teardown_class,在整个测试文件中的一个class中所有的用例的签后运行 ----class类
  1:setup_method和teardown_method,在class内的每个方法运行前后运行 ---------方法
  1:setup_function和teardown_function,在非class下属的每个测试方法的前后运行 ----函数
    分层分级(不同级别有不同方法

9:pytest数据驱动(参数化) @pytest.mark.parametrize("a",[1,2,3]):参数化传一组参数  @pytest.mark.parametrize("a,b", [(1,2),(3,4),(5,6)]) :参数化传多组参数

  登录账户密码(name和psw不同的用例组合,一个接口几十个用例怎么做----几十组数据----传的参数不同(什么请求方式和各种都一样)

  可以把name和psw分别采取多组数据进行参数化,数据分离,一个接口跑4次,每次用不同的参数)

	import pytest
	#[(1,2),(3,4),(5,6)]   [1,2,3]
	class Test_login():  
		def setup_class(self):
			print("执行测试类之前,我需要执行操作")

		@pytest.mark.parametrize("a",[1,2,3])			#("变量名",[1,2,3]),数据需要封装成一个列表,多个数据需要封装成列表嵌套元组   ----数据驱动
		def test_login01(self,a):  				#数据驱动,一定要把变量名a引入引来,不然无法参数化
			print("---test_login01----")
			assert 1 + 1 == a

		@pytest.mark.parametrize("a,b", [(1,2),(3,4),(5,6)])    #数据驱动传多组参数
		def test_login02(self,a,b):
			 print("---test_login02----")
			 assert a + 1 == b

		def teardown_class(self):
			print("------该测试类的环境清除-----")

	if __name__ == '__main__':
		pytest.main(["test_func01.py","-s"])  

10:pytest结合allure报告操作  

  一:pytest自带的报告框架  pytest-html

  二:allure环境搭建(allure是报告库不是python专属的,很全面的框架)-allure报告漂亮

    1:下载allure.zip(压缩包)
    2:解压allure.zip到一个文件目录
    3:将allure-2.13.3\bin路径添加到环境变量path
    4:pip install allure-pytest -------allure报告本身不是很漂亮,通过allure-pytest这个库可以定制化报告,让报告变得很漂亮
    5:验证(cmd输入allure)

  三:allure和pytest联合执行生成报告:运行两条语句

    1:执行pytest单元测试,生成的allure报告需要的数据存在/tmp目录

    pytest -sq --alluredir=../report/tmp   #pytest把allure报告的生成的中间文件放到一个临时文件里面(pytets生成报告,需要数据,所以先把数据存起来)

                      #所有的报告需要数据支持的,数据来源pytest框架本身,结果数据存到一个文件,存在../report/tmp文件夹 

                      #tmp临时文件,一般json格式      

    2:执行命令,生成测试报告

    allure generate ../report/tmp -o ../report/report -clean         #allure指令生成对应报告

  四:allure模拟代码

        import pytest
        import os
        class Test_login():  
            def setup_class(self):
                print("执行测试类之前,我需要执行操作")

            @pytest.mark.parametrize("a",[1,2,3])
            def test_login01(self,a):  
                print("---test_login01----")
                assert 1 + 1 == a

            @pytest.mark.parametrize("a,b", [(1,2),(3,4),(5,6)])
            def test_login02(self,a,b):
                 print("---test_login02----")
                 assert a + 1 == b

            def teardown_class(self):
                print("------该测试类的环境清除-----")

        if __name__ == '__main__':
                            #需要打印对应的信息,需要在列表里面加-s
                            #1:--alluredir ---生成临时文件,测试用例的结果数据放到目录   --alluredir   存放目录
            pytest.main(["test_func01.py","-s","--alluredir","../report/tmp"])  #框架自己调用函数
                            #通过--alluredir把allure需要的数据存到../report/tmp这个路径下面
                            #../--所在路径的父级别目录是test_case的目录隔壁邻居report文件下tmp,专门放alluer报告生成的需要的数据源

                            # 2:临时数据没有报告的,allure generate allure才会生成报告   -----allure生成生成allure报告--generate allure生成器,cmd指令
                            #需要os模块os.system()调用指令可以在local的cmd里面敲
            os.system("allure generate ../report/tmp -o ../report/report --clean")
                            #os.system("allure generate 报告需要的数据 -o 报告存放目录 --clean")
                            #-o生成
                            #allure generate生成报告指令,把../report/tmp 的文件-o生成报告out out一下,生成的报告放在../report/report
                            #--clean把上次报告清除一下用--clean
                 #allure报告生成的是一个服务,(本地服务)和jinkins结合,放在整个里面去集成,放到公共服务器里面

  五:allure报告的优化

        import pytest
        import os
        import allure       
        @allure.feature("登录模块")                                                      #一级标题,大模块标题(类标签)
        class Test_login():                                                              
            def setup_class(self):                                                                  
                print("执行测试类之前,我需要执行操作")

            @allure.story("登录login01")                                                  # 二级标签(每个接口的标签)
            @allure.title("login01")                                                     # 标题,每个用例带个标题(报告体现在每个测试用例)(一个接口有几个用例,title用例的标签)
            @pytest.mark.parametrize("a",[1,2,3])                                      
            def test_login01(self,a):                                                      
                print("---test_login01----")
                assert 1 + 1 == a

            @allure.story("登录login02")                                                  # 二级标签,定制allure报告层级
            @allure.title("login02")                                                     #标题,每个用例带个标题(报告体现在每个测试用例)
            @pytest.mark.parametrize("a,b", [(1,2),(3,4),(5,6)])                      
            def test_login02(self,a,b):
                 print("---test_login02----")
                 assert a + 1 == b

            def teardown_class(self):                                               
                print("------该测试类的环境清除-----")


        @allure.feature("购物模块")
        class Test_Shopping():
            @allure.story("shopping")
            @allure.title("shopping01")
            @pytest.mark.parametrize("a,b", [(1, 2), (3, 4), (5, 6)])
            def test_shopping(self, a, b):
                print("---test_login02----")
                assert a + 1 == b
        if __name__ == '__main__':
            pytest.main(["test_func01.py","-s","--alluredir","../report/tmp"])    
            os.system("allure generate ../report/tmp -o ../report/report --clean")
            #allure报告生成的是一个服务,(本地服务)和jinkins结合,放在整个里面去集成,放到公共服务器里面            

  六:其他知识点:

    测试用例一般写在excel表格文件里面,数据分离(维护好excel就行)

    pytest--从头到尾到报告执行发邮件

    字典是一种存储类型,json是一种格式(完全不同)

 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐