• 业务脚本pytest封装


    一、前置+后置语法

    前置测试类+后置测试类 setup_class+teardown_class(整个流程只运行一遍)

    前置测试方法+后置测试方法setup_method+teardown_method

    二、有序、跳过语法

    1.有序

    @pytest.mark.run(order=xx)

    注意:导入插件库,pip install pytest-ordering

    2.跳过

    普通跳过 @pytest.mark.skip("说明")

    满足条件跳过 @pytest.mark.skipif(condition=='冒烟',reason='smoketest')

    查看跳过方法原因说明 pytest xxx.py -vs

    三、关联传递参数语法

    @pytest.fixture

    1.同一个脚本内部参数传递

    1. @pytest fixture()
    2. def test_case01():
    3. num1=60
    4. return num1
    5. def test_case02(test_case01):
    6. num2=test_case01
    7. print("从方法1传递的值",num2)

    2.不同脚本之间参数传递

    2.1引入其他脚本对应的测试类或测试方法

    from 路径.文件名 import 测试类/测试方法

    2.2在其他脚本的相关方法前,需要打@pytest.fixture()标签

    1. @pytest.fixture()
    2. def test_case1():
    3. num1=666
    4. nlist[1,2,3]
    5. return nlist

    2.3在当前脚本中直接使用

    1. def test_case2(test_case1)
    2. num=test_case1
    3. print("从其他文件通过fixture传入的数据",num)

    2.parametrize方法

    2.1引入其他脚本对应的测试类或测试方法

    2.2只能是普通方法,不能加fixture标签

    2.3在当前脚本中是参数标签

    1. @pytest.mark.parametrize('nun',testcase1())
    2. def testcase3(num):
    3. num6=num
    4. print("从其他文件中通过parametrize传入的数据",num6)

    3.使用全局配置文件

    1. import pytest
    2. @pytest.fixture()
    3. def test_data():
    4. datalist=[1,2,5,8,10]
    5. return datalist

    4.全局变量

    1. import pytest
    2. global_list=[1,2,3]

    5.小结

    5.1在当前脚本需要传递参数,就使用fixture

    5.2偶发性的需要使用其他脚本的参数,如果已经设置fixture,引入该文件,用fixture方法进行参数传递,如果没有设置fixture,可以使用普通方法进行传输,结合parametrize标签

    5.3大批量的脚本需要使用相同的测试数据,数据放入conftest.py文件中  ,所有当前脚本的项目都可以直接使用,不需要引入文件   

    5.4当前脚本需要传递某些公共的参数,不想定义fixture,使用全局变量就可以 ,放在脚本最开始进行定义

    四、脚本-独立+有序(新增组加新增用户)

    1. # 导入相关需要用到的类库
    2. import pytest
    3. from selenium import webdriver
    4. # 创建业务流程类,独立+无序,新建小组+新建用户
    5. # @pytest.mark.smoke1
    6. class Test_add_group_user():
    7. # 前置类方法,在整个流程中只走一遍
    8. def setup_class(self):
    9. # 定义url
    10. self.url="http://testplt.share.atstudy.com/admin/login/?next=/admin/"
    11. # 打开谷歌浏览器
    12. self.driver=webdriver.Chrome()
    13. # 发送请求
    14. self.driver.get(self.url)
    15. # 输入用户名
    16. self.driver.find_element_by_name("username").send_keys('atstudy')
    17. # 输入密码
    18. self.driver.find_element_by_name("password").send_keys('51testing')
    19. # 点击登录按钮
    20. self.driver.find_element_by_xpath('//*[@id="login-form"]/div[3]/input').click()
    21. # 测试添加组
    22. # 执行顺序设置为2
    23. @pytest.mark.run(order=2)
    24. def test_add_group(self):
    25. # 打开添加用户组页面,这里的url只是添加用户方法自己使用,所以不需要加self
    26. url="http://testplt.share.atstudy.com/admin/auth/group/add/"
    27. # 发送请求
    28. self.driver.get(url)
    29. # 输入用户组名称
    30. self.driver.find_element_by_id('id_name').send_keys("group1")
    31. # 选择全部权限
    32. self.driver.find_element_by_id('id_permissions_add_all_link').click()
    33. # 点击确定按钮
    34. self.driver.find_element_by_xpath('//*[@id="group_form"]/div/div/input[1]').click()
    35. # 测试添加用户
    36. # 执行顺序设置为1
    37. @pytest.mark.run(order=1)
    38. def test_add_user(self):
    39. # 打开添加用户页面
    40. url='http://testplt.share.atstudy.com/admin/auth/user/add/'
    41. # 发送页面请求
    42. self.driver.get(url)
    43. # 输入用户名
    44. self.driver.find_element_by_id('id_username').send_keys("user")
    45. # 输入密码
    46. self.driver.find_element_by_id('id_password1').send_keys("123456Pwd")
    47. # 再一次输入密码
    48. self.driver.find_element_by_id('id_password2').send_keys("123456Pwd")
    49. # 点击确定按钮
    50. self.driver.find_element_by_xpath('//*[@id="user_form"]/div/div/input[1]').click()
    51. # 执行后置类方法,整个流程中只运行一次
    52. def teardown_class(self):
    53. self.driver.close()

    五、删除添加的用户-联调参数-先用面向对象先调通先

    1. from selenium import webdriver
    2. import time
    3. # 面向对象,先把函数先跑通先,再封装在pytest里面,因为用pytest驱动去跑封装后的代码时,如果报错,控制台的日志不好定位
    4. # 定义类
    5. class Test_delete_user():
    6. # 类前置方法(一个流程里面只走一次)
    7. # 登录
    8. def test_login(self):
    9. # 定义url
    10. self.url='http://testplt.share.atstudy.com/admin/login/?next=/admin/'
    11. # 打开谷歌浏览器
    12. self.driver=webdriver.Chrome()
    13. # 发送请求
    14. self.driver.get(self.url)
    15. # 输入用户名
    16. self.driver.find_element_by_name('username').send_keys('atstudy')
    17. # 输入密码
    18. self.driver.find_element_by_name('password').send_keys('51testing')
    19. # 点击登录按钮
    20. self.driver.find_element_by_xpath('//*[@id="login-form"]/div[3]/input').click()
    21. # 添加用户
    22. def test_add_user(self):
    23. # 定义添加用户页面
    24. url='http://testplt.share.atstudy.com/admin/auth/user/add/'
    25. # 发送请求
    26. self.driver.get(url)
    27. # 定义usename
    28. username='user3'
    29. # 输入用户名
    30. self.driver.find_element_by_id('id_username').send_keys(username)
    31. # 输入密码
    32. self.driver.find_element_by_id('id_password1').send_keys('123456Pwd')
    33. # 再次确认密码
    34. self.driver.find_element_by_id('id_password2').send_keys('123456Pwd')
    35. # 点击确定按钮
    36. self.driver.find_element_by_xpath('//*[@id="user_form"]/div/div/input[1]').click()
    37. # 返回用户名到其他方法中
    38. return(username)
    39. # 删除用户
    40. def test_delete_user(self,username):
    41. url='http://testplt.share.atstudy.com/admin/auth/user/'
    42. self.driver.get(url)
    43. num=len(self.driver.find_elements_by_class_name('field-username'))
    44. print("统计下有多少个用户",num)
    45. for i in range(1,num+1):
    46. uname=self.driver.find_element_by_xpath('//*[@id="result_list"]/tbody/tr['+str(i)+']/th/a').text
    47. print(uname)
    48. if uname==username:
    49. time.sleep(3)
    50. # 点击用户名信息
    51. self.driver.find_element_by_xpath('//*[@id="result_list"]/tbody/tr['+str(i)+']/th/a').click()
    52. # 点击删除用户的按钮
    53. self.driver.find_element_by_xpath('//*[@id="user_form"]/div/div/p/a').click()
    54. # 获取到新页面上的句柄,然后切换到新窗口
    55. self.driver.switch_to.window(self.driver.window_handles[-1])
    56. # 然后点击确认删除按钮
    57. self.driver.find_element_by_xpath('//*[@id="content"]/form/div/input[2]').click()
    58. # 如果break跟if对齐的话,在遍历完第一个元素,就会跳出循环,后面的判断也都就执行不了
    59. break
    60. if __name__ == '__main__':
    61. # 实例化对象
    62. obj=Test_delete_user()
    63. # 调用方法
    64. obj.test_login()
    65. username=obj.test_add_user()
    66. obj.test_delete_user(username)

    五、删除添加的用户-联调参数-python已封装

    1. # 删除刚添加的用户
    2. # 需要导入的类库
    3. from selenium import webdriver
    4. import pytest
    5. import time
    6. # 定义类
    7. class Test_delete_user():
    8. # 类前置方法(一个流程里面只走一次)
    9. def setup_class(self):
    10. # 定义url
    11. self.url='http://testplt.share.atstudy.com/admin/login/?next=/admin/'
    12. # 打开谷歌浏览器
    13. self.driver=webdriver.Chrome()
    14. # 发送请求
    15. self.driver.get(self.url)
    16. # 输入用户名
    17. self.driver.find_element_by_name('username').send_keys('atstudy')
    18. # 输入密码
    19. self.driver.find_element_by_name('password').send_keys('51testing')
    20. # 点击登录按钮
    21. self.driver.find_element_by_xpath('//*[@id="login-form"]/div[3]/input').click()
    22. # 添加用户
    23. # 添加传参标签
    24. @pytest.fixture()
    25. def test_add_user(self):
    26. # 定义添加用户页面
    27. url='http://testplt.share.atstudy.com/admin/auth/user/add/'
    28. # 发送请求
    29. self.driver.get(url)
    30. # 定义usename
    31. username='user3'
    32. # 输入用户名
    33. self.driver.find_element_by_id('id_username').send_keys(username)
    34. # 输入密码
    35. self.driver.find_element_by_id('id_password1').send_keys('123456Pwd')
    36. # 再次确认密码
    37. self.driver.find_element_by_id('id_password2').send_keys('123456Pwd')
    38. # 点击确定按钮
    39. self.driver.find_element_by_xpath('//*[@id="user_form"]/div/div/input[1]').click()
    40. # 返回用户名到其他方法中
    41. return(username)
    42. # 删除用户
    43. def test_delete_user(self,test_add_user):
    44. # 定义用户信息页
    45. url='http://testplt.share.atstudy.com/admin/auth/user/'
    46. # 发送请求
    47. self.driver.get(url)
    48. # 统计用户元素的个数
    49. num=len(self.driver.find_elements_by_class_name('field-username'))
    50. print("统计下有多少个用户",num)
    51. # 依次遍历这几个用户数,找到遍历的值等于添加的用户信息,跳出循环
    52. for i in range(1,num+1):
    53. uname=self.driver.find_element_by_xpath('//*[@id="result_list"]/tbody/tr['+str(i)+']/th/a').text
    54. print(uname)
    55. if uname==test_add_user:
    56. time.sleep(3)
    57. # 点击用户名信息
    58. self.driver.find_element_by_xpath('//*[@id="result_list"]/tbody/tr['+str(i)+']/th/a').click()
    59. # 点击删除用户的按钮
    60. self.driver.find_element_by_xpath('//*[@id="user_form"]/div/div/p/a').click()
    61. # 获取到新页面上的句柄,然后切换到新窗口
    62. self.driver.switch_to.window(self.driver.window_handles[-1])
    63. # 然后点击确认删除按钮
    64. self.driver.find_element_by_xpath('//*[@id="content"]/form/div/input[2]').click()
    65. # 如果break跟if对齐的话,在遍历完第一个元素,就会跳出循环,后面的判断也都就执行不了
    66. break
    67. if __name__ == '__main__':
    68. pytest.main(["-s","test_8.py","-v"])

    六、选择权限,添加用户组

    1. # 选择权限,添加用户组
    2. import pytest
    3. from selenium import webdriver
    4. from selenium.webdriver.support.select import Select
    5. import random
    6. num=6
    7. # 定义类
    8. class Test_selectautho_addgroup():
    9. # 类前置方法,流程中只运行一次
    10. def setup_class(self):
    11. # 定义登录url
    12. self.url="http://testplt.share.atstudy.com/admin/login/?next=/admin/"
    13. # 打开谷歌浏览器
    14. self.driver=webdriver.Chrome()
    15. # 发起登录请求
    16. self.driver.get(self.url)
    17. # 输入用户名
    18. self.driver.find_element_by_name("username").send_keys("atstudy")
    19. # 输入密码
    20. self.driver.find_element_by_name("password").send_keys("51testing")
    21. # 点击登录按钮
    22. self.driver.find_element_by_xpath('//*[@id="login-form"]/div[3]/input').click()
    23. # 选择权限
    24. @pytest.fixture()
    25. def test_select_autho(self):
    26. # 打开选择权限的页面,这个页面是这个方法自己的
    27. # 定义autho列表
    28. autholist=[]
    29. url='http://testplt.share.atstudy.com/admin/auth/permission/'
    30. # 发送请求,它只是一个发送请求,并没有接收请求结果
    31. self.driver.get(url)
    32. # 取多少个权限
    33. for j in range (0,num):
    34. # 生成随机数
    35. i=random.randint(1,15)
    36. print(i)
    37. # 取权限页面上的第几个权限值
    38. autho=self.driver.find_element_by_xpath('//*[@id="result_list"]/tbody/tr['+str(i)+']/th/a').text
    39. # 取出来之后,打印到autho列表里面
    40. autholist.append(autho)
    41. print(autholist)
    42. # 返回autholist,可以到其他方法中
    43. return autholist
    44. # 添加用户组
    45. def test_group(self,test_select_autho):
    46. # 定义url,只是本方法内部使用
    47. url = 'http://testplt.share.atstudy.com/admin/auth/group/add/'
    48. # 发送请求
    49. self.driver.get(url)
    50. # 输入组名
    51. self.driver.find_element_by_id('id_name').send_keys('group1')
    52. # 在autho列表里面去遍历autho
    53. for autho in test_select_autho:
    54. # 找到autho列表框
    55. select_autho=self.driver.find_element_by_id('id_permissions_from')
    56. # 在列表框里面去放入autho,然后转换成文本类型
    57. Select(select_autho).select_by_visible_text(autho)
    58. # 点击添加按钮
    59. self.driver.find_element_by_xpath('//*[@id="id_permissions_add_link"]').click()
    60. # 类后置方法,流程中只走一遍
    61. def teardown_class(self):
    62. self.driver.close()

  • 相关阅读:
    C++入门知识——构造函数初始化列表、static与友元
    Apache Pulsar工作原理
    美信监控易:网络管理之链路专线管理
    解析ZooKeeper底层维护主从数据一致
    自学软件测试,学到什么程度可以出去找工作啊?
    物联网浏览器(IoTBrowser)-使用深度学习开发防浸水远程报警
    Python常用视频编辑操作——读取与保存视频、更改帧数、拼接视频、视频语音合并、视频与图像互转等
    PIE-engine 教程 ——新疆石河子市棉花种植面积提取(阈值法)案例分析
    ProxmoxVE迁移虚拟机到其他PVE(基于QCOW2)
    MyBatis Plus详细教程
  • 原文地址:https://blog.csdn.net/weixin_47547541/article/details/126657579