业务脚本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.同一个脚本内部参数传递

@pytest fixture()
def test_case01():
    num1=60
    return num1
def test_case02(test_case01):
    num2=test_case01
    print("从方法1传递的值",num2)

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

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

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

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

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

2.3在当前脚本中直接使用

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

2.parametrize方法

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

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

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

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

3.使用全局配置文件

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

4.全局变量

import pytest
global_list=[1,2,3]

5.小结

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

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

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

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

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

# 导入相关需要用到的类库
import pytest
from selenium import webdriver

# 创建业务流程类,独立+无序,新建小组+新建用户
# @pytest.mark.smoke1
class Test_add_group_user():
    # 前置类方法,在整个流程中只走一遍
    def setup_class(self):
        # 定义url
        self.url="http://testplt.share.atstudy.com/admin/login/?next=/admin/"
        # 打开谷歌浏览器
        self.driver=webdriver.Chrome()
        # 发送请求
        self.driver.get(self.url)
        # 输入用户名
        self.driver.find_element_by_name("username").send_keys('atstudy')
        # 输入密码
        self.driver.find_element_by_name("password").send_keys('51testing')
        # 点击登录按钮
        self.driver.find_element_by_xpath('//*[@id="login-form"]/div[3]/input').click()
    # 测试添加组
    # 执行顺序设置为2
    @pytest.mark.run(order=2)
    def test_add_group(self):
        # 打开添加用户组页面,这里的url只是添加用户方法自己使用,所以不需要加self
        url="http://testplt.share.atstudy.com/admin/auth/group/add/"
        # 发送请求
        self.driver.get(url)
        # 输入用户组名称
        self.driver.find_element_by_id('id_name').send_keys("group1")
        # 选择全部权限
        self.driver.find_element_by_id('id_permissions_add_all_link').click()
        # 点击确定按钮
        self.driver.find_element_by_xpath('//*[@id="group_form"]/div/div/input[1]').click()

    # 测试添加用户
    # 执行顺序设置为1
    @pytest.mark.run(order=1)
    def test_add_user(self):
        # 打开添加用户页面
        url='http://testplt.share.atstudy.com/admin/auth/user/add/'
        # 发送页面请求
        self.driver.get(url)
        # 输入用户名
        self.driver.find_element_by_id('id_username').send_keys("user")
        # 输入密码
        self.driver.find_element_by_id('id_password1').send_keys("123456Pwd")
        # 再一次输入密码
        self.driver.find_element_by_id('id_password2').send_keys("123456Pwd")
        # 点击确定按钮
        self.driver.find_element_by_xpath('//*[@id="user_form"]/div/div/input[1]').click()
# 执行后置类方法,整个流程中只运行一次
    def teardown_class(self):
        self.driver.close()

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

from selenium import webdriver
import time
# 面向对象,先把函数先跑通先,再封装在pytest里面,因为用pytest驱动去跑封装后的代码时,如果报错,控制台的日志不好定位



# 定义类
class Test_delete_user():
    # 类前置方法(一个流程里面只走一次)
    # 登录
    def test_login(self):
        # 定义url
        self.url='http://testplt.share.atstudy.com/admin/login/?next=/admin/'
        # 打开谷歌浏览器
        self.driver=webdriver.Chrome()
        # 发送请求
        self.driver.get(self.url)
        # 输入用户名
        self.driver.find_element_by_name('username').send_keys('atstudy')
        # 输入密码
        self.driver.find_element_by_name('password').send_keys('51testing')
        # 点击登录按钮
        self.driver.find_element_by_xpath('//*[@id="login-form"]/div[3]/input').click()

    # 添加用户
    def test_add_user(self):
        # 定义添加用户页面
        url='http://testplt.share.atstudy.com/admin/auth/user/add/'
        # 发送请求
        self.driver.get(url)
        # 定义usename
        username='user3'
        # 输入用户名
        self.driver.find_element_by_id('id_username').send_keys(username)
        # 输入密码
        self.driver.find_element_by_id('id_password1').send_keys('123456Pwd')
        # 再次确认密码
        self.driver.find_element_by_id('id_password2').send_keys('123456Pwd')
        # 点击确定按钮
        self.driver.find_element_by_xpath('//*[@id="user_form"]/div/div/input[1]').click()
        # 返回用户名到其他方法中
        return(username)

    # 删除用户
    def test_delete_user(self,username):
        url='http://testplt.share.atstudy.com/admin/auth/user/'
        self.driver.get(url)
        num=len(self.driver.find_elements_by_class_name('field-username'))
        print("统计下有多少个用户",num)
        for i in range(1,num+1):
            uname=self.driver.find_element_by_xpath('//*[@id="result_list"]/tbody/tr['+str(i)+']/th/a').text
            print(uname)
            if uname==username:
                time.sleep(3)
                # 点击用户名信息
                self.driver.find_element_by_xpath('//*[@id="result_list"]/tbody/tr['+str(i)+']/th/a').click()
                # 点击删除用户的按钮
                self.driver.find_element_by_xpath('//*[@id="user_form"]/div/div/p/a').click()
                # 获取到新页面上的句柄,然后切换到新窗口
                self.driver.switch_to.window(self.driver.window_handles[-1])
                # 然后点击确认删除按钮
                self.driver.find_element_by_xpath('//*[@id="content"]/form/div/input[2]').click()
                # 如果break跟if对齐的话,在遍历完第一个元素,就会跳出循环,后面的判断也都就执行不了
                break

if __name__ == '__main__':
    # 实例化对象
    obj=Test_delete_user()
    # 调用方法
    obj.test_login()
    username=obj.test_add_user()
    obj.test_delete_user(username)


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

# 删除刚添加的用户
# 需要导入的类库
from selenium import webdriver
import pytest
import time
# 定义类
class Test_delete_user():
    # 类前置方法(一个流程里面只走一次)
    def setup_class(self):
        # 定义url
        self.url='http://testplt.share.atstudy.com/admin/login/?next=/admin/'
        # 打开谷歌浏览器
        self.driver=webdriver.Chrome()
        # 发送请求
        self.driver.get(self.url)
        # 输入用户名
        self.driver.find_element_by_name('username').send_keys('atstudy')
        # 输入密码
        self.driver.find_element_by_name('password').send_keys('51testing')
        # 点击登录按钮
        self.driver.find_element_by_xpath('//*[@id="login-form"]/div[3]/input').click()


    # 添加用户
    # 添加传参标签
    @pytest.fixture()
    def test_add_user(self):
        # 定义添加用户页面
        url='http://testplt.share.atstudy.com/admin/auth/user/add/'
        # 发送请求
        self.driver.get(url)
        # 定义usename
        username='user3'
        # 输入用户名
        self.driver.find_element_by_id('id_username').send_keys(username)
        # 输入密码
        self.driver.find_element_by_id('id_password1').send_keys('123456Pwd')
        # 再次确认密码
        self.driver.find_element_by_id('id_password2').send_keys('123456Pwd')
        # 点击确定按钮
        self.driver.find_element_by_xpath('//*[@id="user_form"]/div/div/input[1]').click()
        # 返回用户名到其他方法中
        return(username)


    # 删除用户
    def test_delete_user(self,test_add_user):
        # 定义用户信息页
        url='http://testplt.share.atstudy.com/admin/auth/user/'
        # 发送请求
        self.driver.get(url)
        # 统计用户元素的个数
        num=len(self.driver.find_elements_by_class_name('field-username'))
        print("统计下有多少个用户",num)
        # 依次遍历这几个用户数,找到遍历的值等于添加的用户信息,跳出循环
        for i in range(1,num+1):
            uname=self.driver.find_element_by_xpath('//*[@id="result_list"]/tbody/tr['+str(i)+']/th/a').text
            print(uname)
            if uname==test_add_user:
                time.sleep(3)
                # 点击用户名信息
                self.driver.find_element_by_xpath('//*[@id="result_list"]/tbody/tr['+str(i)+']/th/a').click()
                # 点击删除用户的按钮
                self.driver.find_element_by_xpath('//*[@id="user_form"]/div/div/p/a').click()
                # 获取到新页面上的句柄,然后切换到新窗口
                self.driver.switch_to.window(self.driver.window_handles[-1])
                # 然后点击确认删除按钮
                self.driver.find_element_by_xpath('//*[@id="content"]/form/div/input[2]').click()
                # 如果break跟if对齐的话,在遍历完第一个元素,就会跳出循环,后面的判断也都就执行不了
                break

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

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

# 选择权限,添加用户组
import pytest
from selenium import webdriver
from selenium.webdriver.support.select import Select
import random
num=6

# 定义类
class Test_selectautho_addgroup():
# 类前置方法,流程中只运行一次
    def setup_class(self):
        # 定义登录url
        self.url="http://testplt.share.atstudy.com/admin/login/?next=/admin/"
        # 打开谷歌浏览器
        self.driver=webdriver.Chrome()
        # 发起登录请求
        self.driver.get(self.url)
        # 输入用户名
        self.driver.find_element_by_name("username").send_keys("atstudy")
        # 输入密码
        self.driver.find_element_by_name("password").send_keys("51testing")
        # 点击登录按钮
        self.driver.find_element_by_xpath('//*[@id="login-form"]/div[3]/input').click()

    # 选择权限
    @pytest.fixture()
    def test_select_autho(self):
        # 打开选择权限的页面,这个页面是这个方法自己的
        # 定义autho列表
        autholist=[]
        url='http://testplt.share.atstudy.com/admin/auth/permission/'
        # 发送请求,它只是一个发送请求,并没有接收请求结果
        self.driver.get(url)
        # 取多少个权限
        for j in range (0,num):
        # 生成随机数
            i=random.randint(1,15)
            print(i)
        # 取权限页面上的第几个权限值
            autho=self.driver.find_element_by_xpath('//*[@id="result_list"]/tbody/tr['+str(i)+']/th/a').text
        # 取出来之后,打印到autho列表里面
            autholist.append(autho)
        print(autholist)
       # 返回autholist,可以到其他方法中
        return autholist

    # 添加用户组
    def test_group(self,test_select_autho):
        # 定义url,只是本方法内部使用
        url = 'http://testplt.share.atstudy.com/admin/auth/group/add/'
        # 发送请求
        self.driver.get(url)
        # 输入组名
        self.driver.find_element_by_id('id_name').send_keys('group1')
        # 在autho列表里面去遍历autho
        for autho in test_select_autho:
            # 找到autho列表框
            select_autho=self.driver.find_element_by_id('id_permissions_from')
            # 在列表框里面去放入autho,然后转换成文本类型
            Select(select_autho).select_by_visible_text(autho)
        # 点击添加按钮
        self.driver.find_element_by_xpath('//*[@id="id_permissions_add_link"]').click()


    # 类后置方法,流程中只走一遍
    def teardown_class(self):
        self.driver.close()

你可能感兴趣的:(pytest,pytest)