0


pytest测试框架快速搭建

一、介绍

  1. pytest是一个非常成熟的Python测试框架,能够支持简单的单元测试和复杂的功能测试,还可以用来做selenium/appnium等自动化测试、接口自动化测试(pytest+requests);pytest具有很多第三方插件,并且可以自定义扩展,比较好用的如pytest-selenium(集成selenium)、pytest-html(完美html测试报告生成)、pytest-rerunfailures(失败case重复执行)、pytest-xdist(多CPU分发)等。

二、安装

  1. 安装命令:pip install pytest
  2. 验证安装:pytest --version
  3. 安装测试报告模板:pip install pytest-html
  4. 安装失败后重新执行模板: pip install pytest-rerunfailures

三、pytest约束规则

  1. 1、文件名要满足test_*.py格式或*_test.py格式。
  2. 2、测试类以Test开头,并且不能带有 init 方法(注意:定义class时,需要以T开头,不然pytest是不会去运行该class的,正是由于有Test开头做标识,不需要init方法启动(个人理解))
  3. 3、类中,方法以test开头,可以包含一个或多个test_开头的函数。 在执行pytest命令时,会自动从当前目录及子目录中寻找符合上述约束的测试函数来执行。
  4. 4、批量执行,脚本名以 test 开头。

四、编写脚本

  1. import pytest
  2. # 被测试函数
  3. def add(a, b):
  4. return a + b
  5. class TestCase:
  6. # 测试脚本
  7. def test_add(self):
  8. assert 3 == add(1, 2)
  9. if __name__ == '__main__':
  10. pytest.main()
  1. 通过断言,检验定义的方法 add 输出的结果是否符合预期

五、运行

  1. 方式:输入命令:pytest 参数 命令 脚本

collected 2 items :表示加载到两个测试用例;

六、常用参数

  1. 1、-v 输出详细的信息
  2. 2、-s 输出测试函数或测试方法print内容
  3. 3、-k 如: -k add 执行所有测试用例名中含有“add”的用例
  4. 4、-m按分类执行测试点; -m a 则对标记为a 的用例进行测试,不标记为a 的用例不会被执行;
  5. 5、-x 执行中有fail失败的用例,立刻停止
  6. 6、--maxfail 执行失败的最大次数,如果设定最大失败的次数是2 那么如果两个用例执行失败, 后面的会停止执行;如 pytest --maxfail =2
  7. 7、–tb=line 错误信息在一行展示

七、参数化

  1. 例如进行接口测试时,测试登录功能,上传图片功能等;可能只是字符串长度不一样、字符种类不一样,文件大小不一样,或是否为空等,但是执行的用例是一样的,这样为了方便,不用重复写;可以使用参数化,把不同的参数,传到同一个用例里。
  1. @pytest.mark.parametrize('a',[1,2,3,4,5])
  2. def test(a):
  3. print(a)
  4. if __name__ == '__main__':
  5. pytest.main()

八、前置后置

  1. 模块级:该方法表示只能**类外面**执行用例过程中,作用范围为当前模块,当前模块执行前后都运行一次前置和后置;无论有多少个用例,模块级的前置和后置都只跑一遍。
  2. setup_module(),前置,模块执行前运行一次;
  3. teardown_module(),后置,模块执行后运行一次;
  4. 函数级:该方法表示在**类外面**执行用例过程中,作用范围为当前面模块中的每一个测试函数,模块中的每个用例执行前后分别运行一次。
  5. setup_function(),前置,每个用例执行前运行一次
  6. teardown_function,后置,每个执行后运行一次;
  7. 类级别:作用范围为当前**类中**的每一个测试用例,当前类执行前后分别运行一次。**只执行1次测试前置和测试后置**
  8. setup_class(),前置,类中执行前运行一次
  9. teardown_class,后置,类中执行后运行一次;
  10. 方法级:作用范围为类中的每个测试方法,每次执行测试用例前,测试前置和测试后置都会执行一次。
  11. setup_method()或setup();前置,每个用例执行前运行一次
  12. teardown_method()或teardown();后置,每个执行后运行一次;
  1. import pytest
  2. def setup_module():
  3. print("\n模块前置!")
  4. def teardown_module():
  5. print("模块后置!")
  6. def setup_function():
  7. print("函数前置!")
  8. def teardown_function():
  9. print("函数后置!")
  10. @pytest.mark.parametrize('a',[1,2,3,4,5])
  11. def testModule(a):
  12. print(a)
  13. @pytest.mark.parametrize('a',[6,7])
  14. def testAdd(a):
  15. print(a)
  16. class Testcase:
  17. def setup_class(self):
  18. print("类前置")
  19. def teardown_class(self):
  20. print("类后置")
  21. def setup_method(self):
  22. print("方法前置!")
  23. def teardown_method(self):
  24. print("方法后置!")
  25. @pytest.mark.parametrize('a', [8, 9])
  26. def test(self,a):
  27. print(a)
  28. if __name__ == '__main__':
  29. pytest.main()

九、测试实例

  1. 一、验证登录的 测试用例
  1. import pytest
  2. import requests
  3. #创建session对象,用于实现会话保持
  4. req = requests.session()
  5. #登录 接口
  6. #提前在模块前置把要测试登录接口的数据录入到data里,如用户名过长、非法字符、过短,及密码、预期结果等;data的每组数据为用户名、密码、预期结果
  7. #通过参数化,就可以对所有用例运行一遍,把返回结果与预期结果比对;
  8. #@pytest.mark.parametrize('data',data)
  9. def test_login(data)
  10. url = 'http://192.168.0.1:8080/login'
  11. data ={'username':data[0],'pwd':data[1]}
  12. r = requests.post(url,data)
  13. assert data[2] == r.text
  14. print(r.text)
  15. if __name__ == '__main__':
  16. #运行,并保存报告
  17. pytest.main(['-v',-f'--html={report_path}/{t}.html',case_path])
  1. 二、 验证 template.wps.com 的搜索接口:
  2. 把测试用例写好放到:E:/automationtest/searchParameter.xls ,为了方便处理,Excel表格每列一个参数;参数部分如图:

代码:

  1. import xlrd
  2. import pytest
  3. import requests
  4. #获取工作薄文件对象
  5. wb = xlrd.open_workbook("E:/automationtest/searchParameter.xls")
  6. #返回Excel文件中所有的sheet对象,通过对象调用 name 返回sheet名称
  7. sheets = wb.sheets()
  8. #sheet名获取指定的表
  9. sheet = wb.sheet_by_name("Sheet1")
  10. #用list 保存从xls表读取出来的数据,这些都是要做接口测试的参数;
  11. list=[]
  12. for index in range(1,sheet.nrows):
  13. list.append(sheet.row_values(index,7,14))
  14. index = index + 1
  15. for index in list:
  16. print(index)
  17. #第n行,第m列的元素
  18. # value = sheet.cell(n,m).value
  19. #取出所有参数,做参数化;
  20. '''
  21. #不能用下面这种方式做;否则就是所有参数的全组合;
  22. #这种类型的参数化是所有的组合;不是4列;
  23. @pytest.mark.parametrize("platf", platf)
  24. @pytest.mark.parametrize("excludePayTemplate", excludePayTemplate)
  25. @pytest.mark.parametrize("is_excluded", is_excluded)
  26. @pytest.mark.parametrize("excluded_member_discount", excluded_member_discount)
  27. @pytest.mark.parametrize("keyword", keyword)
  28. @pytest.mark.parametrize("start", start)
  29. @pytest.mark.parametrize("count", count)
  30. '''
  31. @pytest.mark.parametrize("list", list)
  32. def testSearch(list):
  33. url = "https://template.wps.com/server/pf/template"
  34. param = {'platf': list[0],'excludePayTemplate':list[1],'is_excluded':list[2],'excluded_member_discount':list[3],'keyword':list[4],'start':list[5],'count':list[6]}
  35. response = requests.get(url=url,params=param)
  36. #输出响应码和响应信息;也可以把预期结果当做一个参数传进来做断言判断
  37. print(response.status_code,' ',response.text,'\n')
  38. if __name__ == "__main__":
  39. pytest.main(["-s", "testSearch.py"])
  1. 项目结构:
  2. ![](https://img-blog.csdnimg.cn/915427fab8734c3ab464d5c3f9f41805.png)
  3. case:保存每个接口的测试脚本;
  4. common:保存公共模块,如数据库操作、CVS文件读取等
  5. data:保存每个接口的测试用例
  6. report:用于保存测试报告

**十、fixture **

  1. **介绍:**
  2. 前面提到前置、后置;编写用例时候需要用到用例的前置和用例的后置,可以用setup_classteardown_class等帮助我们完成,但是不够完善而且灵活性不够强。例如:一个calss中有3条用例,其中2条需要登录,1条不需要登录,这个时候如果在用setupteardown来做就有点不方便。fixture可以用做测试 用例的前置和后置操作,且fixture命令规范没有setupteardown的格式。可以随意命名。控制fixture的前置和后置操作是通过yield关键字进行区分,代码在yield前面的属于前置操作,代码在yield后面的属于后置操作。且fixture不要求前后置同时存在,可以只存在前置或只存在后置。fixture如果有后置内容,无论遇到什么问题,都会进行执行后置的代码。
  3. **使用:**

用 @pytest.fixture() 装饰器声明一个函数是 fixture,如果测试函数的参数列表中包含 fixture 名,那么 pytest 就会检测到,并在运行测试函数之前运行它,fixture 可以返回数据给测试函数。

  1. ** 参数列表:**
  2. @pytest.fixture(scope="function", params=None, autouse=False, ids=None, name=None)
  3. scope 可选参数,默认为 function ,可选值为 functionclassmodulesession,范围依次增加。session的作用域是整个测试会话,即开始执行pytest到结束测试。
  4. autouse:默认:False,需要用例手动调用该fixture;如果是True,所有作用域内的测试用例都会自动调用该fixture
  5. name:默认:装饰器的名称,同一模块的fixture相互调用建议写个不同的name
  1. import pytest
  2. @pytest.fixture
  3. def login():
  4. print("先登录")
  5. yield
  6. print("退出登录 ")
  7. def test_s1(login):
  8. print("测试用例 1:登录后的其它操作!")
  9. def test_s2(): # 不传 login
  10. print("测试用例 2:不需要登录,")
  11. if __name__ == '__main__':
  12. pytest.main()

十一、HTML报告生成

  1. 一种是Pytest pytest-html插件,另一种是 allure-pytest插件;
  2. 使用pytest-html生成html测试报告:
  3. 安装pytest-html插件:pip install pytest-html
  4. 运行命令: --html=reportname.html,其中 reportname为要生成报告的名称。
  5. 如:针对 test.py 生成报告,在 terminal 输入:pytest --html=report.html test.py

本文转载自: https://blog.csdn.net/guanrongl/article/details/124740150
版权归原作者 什么鬼昵称 所有, 如有侵权,请联系我们删除。

“pytest测试框架快速搭建”的评论:

还没有评论