在编写测试用例之前,需要封装好浏览器和基础页面
UI自动化测试的测试用例编写时,按照功能测试步骤,把操作步骤以及结果检验使用代码实现即可,遇到有前置条件的使用set_up()函数实现,后置条件使用tear_down()函数实现,
不同于普通功能测试的地方在于,自动化测试的用例
本文使用以下两个用例做示范
示例1:
用例名称:正确的账号登录系统
测试步骤:
1)打开浏览器并打开测试系统
2)在账号、密码的输入框中输入账号和密码
3)点击登录按钮
预期结果:页面进入测试系统的首页(校验是否正确进入了首页)
后置条件:退出测试系统
示例2:
用例名称:错误的账号登录系统
测试步骤:
1)打开浏览器并打开测试系统
2)在账号、密码的输入框中输入账号和密码
3)点击登录按钮
预期结果:提示账号或密码错误(校验提示语)
普通测试用例(非数据驱动的方式)
import time
import pytest, allure
from PageObiects.loginPage import LoginPage
class TestLoginCase():
@allure.feature('登录')
@pytest.mark.parametrize(['userid', 'password'], [('admin', '111111')])
def test_login_001(self, userid, password): # 正确的用
test_loginpage = LoginPage()
test_loginpage.login_host_(userid, password)
time.sleep(2)
assert test_loginpage.get_element_text(['css selector', 'a.active-tag']) == "首页"
# 退出登录
test_loginpage.logout()
@pytest.mark.parametrize(['userid', 'password'],
[('000026', 'comeon')])
def test_login_002(self, userid, password): # 正确的用例
test_loginpage = LoginPage()
test_loginpage.login_host_(userid, password)
time.sleep(2)
assert test_loginpage.get_element_text(['id', 'content_ics']) == "用户名或密码错误,请重新输入!"
if __name__ == '__main__':
pytest.main(['-sv', __file__])
pytest.main(['test_login.py','-s', '--alluredir=outFlies/reports'])
采用数据驱动的方式(数据分离)
数据使用yaml文件封装(test_login_fail_data.yaml
),格式如下:
# 这里数据有几个,对应用例就有几个参数,需要一一对应,否则正不正确
# 用户名正确,密码错误,提示的元素1,密码不正确
# 用户名正确,密码正确,提示的元素2,首页
- ['admin','111111',['css selector','a.active-tag'],'首页'] # 不添加优先级和用例名称
- ['admin','1111',['id','content_ics'],'用户名或密码错误,请重新输入!']
- ['adin','1111',['id','content_ics'],'用户名或密码错误,请重新输入!']
测试用例的编写如下:
import os
import pytest, allure, time
from PageObiects.loginPage import LoginPage
from configs.env import Env
from utils.handle_path import SMP_Path
from utils.handleyaml import get_yaml_data
class TestLoginCase1():
# 使用数据封装的方式写测试用例
test_login_fail_data1 = get_yaml_data(SMP_Path.testDatas_path / 'test_login_fail_data.yaml')
test_login_fail_data2 = get_yaml_data(SMP_Path.testDatas_path / 'test_login_all_data.yaml')
@allure.epic('供应商自管理UI自动化测试') # 第一层
@allure.feature('用户管理模块测试')
@allure.story('登录测试用例')
@pytest.mark.parametrize('userid, password, locator,expected_text', test_login_fail_data1)
def test_login_001(self, userid, password, locator, expected_text): # 不添加优先级和用例名称
with allure.step('1.打开浏览器'):
test_loginpage = LoginPage()
with allure.step('2.打开并登录供应商自管理系统'):
test_loginpage.login_host_(userid, password)
time.sleep(2)
with allure.step('3.断言'):
assert test_loginpage.get_element_text(locator) == expected_text
# 登录成功的用例需要退出,不成功的不需要退出,需要判断当前的url是否切换到了首页,若切换了,则代表登录成功了
with allure.step('4.断言后的处理'):
if test_loginpage.driver.current_url == Env.MAINPAGE_URL:
test_loginpage.logout()
# 如果只是断言失败,也需要做退出登录的操作,可以使用pytest.assume做断言:
# with pytest.assume: assert test_loginpage.get_element_text(locator) == expected_text
pytest.mark.skip('添加优先级和用例名称的先跳过')
@pytest.mark.parametrize('priority', 'case_title', 'userid, password, locator,expected_text', test_login_fail_data2)
def test_login_002(self, priority, case_title, userid, password, locator, expected_text): # 添加优先级和用例名称
allure.dynamic.title(case_title)
allure.dynamic.severity(priority)
with allure.step('1.打开浏览器'):
test_loginpage = LoginPage()
with allure.step('2.打开并登录供应商自管理系统'):
test_loginpage.login_host_(userid, password)
time.sleep(2)
with allure.step('3.断言'):
assert test_loginpage.get_element_text(locator) == expected_text
with allure.step('4.断言后的处理'):
if test_loginpage.driver.current_url == Env.MAINPAGE_URL:
test_loginpage.logout()
if __name__ == '__main__':
# 执行用例时,可能不需要全部执行,因此可以用过用例的优先级去挑选需要执行的用例
pytest.main(['-sv', __file__, '--alluredir', SMP_Path.reports_path, '--clean-alluredir'])
os.system(f'allure serve {SMP_Path.reports_path}')
在上面的示例中, 如果断言失败,也需要做退出登录的操作,可以使用pytest.assume做断言:
with pytest.assume: assert test_loginpage.get_element_text(locator) == expected_text
运行后,可以得到一个allure报告,按照运行后的链接打开即可查看
网友评论