单元测试--分离4.12
在UI的自动化测试中,我们需要把测试使用到的数据分离到文件中,这个分离到文件里,文件的形式其实很多的,这里主要有JSON的文件和YAML的文件在UI 自动化测试中的应用。
数据驱动:在自动化测试中,把测试中使用到的数据分离出来。JSON,YAML。
页面对象设计模式 po模式(page object)
po模式的3种优势
1、创建可以跨多个测试用例共享的代码
2、减少重复代码的数量
3、如果用户界面发生了维护,我们只需要维护一个地方,这样修改以及维护的成本相对而言是比较低的
需要分离的脚本:
import unittest
import time as t
from selenium import webdriver
class SainTest(unittest.TestCase):
def setUp(self) -> None:
self.driver=webdriver.Chrome()
self.driver.maximize_window()
self.driver.get('https://mail.sina.com.cn/')
self.driver.implicitly_wait(30)
def tearDown(self) -> None:
self.driver.quit()
def test_login_null(self):
'''登陆:验证账户密码为空的错误提示信息'''
self.driver.find_element_by_id('freename').send_keys('')
self.driver.find_element_by_id('freepassword').send_keys('')
self.driver.find_element_by_class_name('loginBtn').click()
t.sleep(5)
divText=self.driver.find_element_by_xpath('/html/body/div[3]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[1]')
self.assertEqual(divText.text,'请输入邮箱名')
def test_login_email_format(self):
'''登陆:登陆:验证账户格式不规范的错误提示信息'''
self.driver.find_element_by_id('freename').send_keys('sdfs')
self.driver.find_element_by_id('freepassword').send_keys('sdzfas')
self.driver.find_element_by_class_name('loginBtn').click()
t.sleep(5)
divText = self.driver.find_element_by_xpath('/html/body/div[3]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[1]')
self.assertIn(divText.text, '您输入的邮箱名格式不正确')
def test_login_inButton(self):
'''登陆:验证自动登陆是否默认勾选'''
divText=self.driver.find_element_by_id('store1')
self.assertTrue(divText.is_selected())
if __name__ == '__main__':
unittest.main()
1、为了方便测试不同的浏览器打开 这边选择对测试固件进行分离,我们把分离的脚本放在-测试框架-initpy 文件中
分离脚本:
class Init(unittest.TestCase):
def setUp(self) -> None:
self.driver = webdriver.Chrome()
self.driver.maximize_window()
self.driver.get('https://mail.sina.com.cn/')
self.driver.implicitly_wait(30)
def tearDown(self) -> None:
self.driver.quit()
2、为了使报错信息更方便今后更改 所以我们分离出用了sina.json文件
分离脚本:
{
"null": "请输入邮箱名",
"format": "您输入的邮箱名格式不正确"
}
3、
为了使报错信息更方便今后更改 所以我们分离出用了sina.yaml文件
分离脚本:
login:
None: 请输入邮箱名
format: 您输入的邮箱名格式不正确
error:
user: admin
passwd: admin
以上3种都用了最终脚本:
import json
from 测试框架.init import Init
import unittest
import time as t
import yaml
from selenium import webdriver
def readJson():
return json.load(open('sina.json',encoding='utf-8'))
def readYaml():
with open('sina.yaml',encoding='utf-8')as f:
return yaml.safe_load(f)
class SainTest(Init):
'''这里已经分离到Init.Py文件中 所以 要从测试框架中的init文件中导入类 由现在这个类继承'''
def test_login_null(self):
'''登陆:验证账户密码为空的错误提示信息'''
self.driver.find_element_by_id('freename').send_keys('')
self.driver.find_element_by_id('freepassword').send_keys('')
self.driver.find_element_by_class_name('loginBtn').click()
t.sleep(5)
divText=self.driver.find_element_by_xpath('/html/body/div[3]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[1]')
# self.assertEqual(divText.text,'请输入邮箱名')
# self.assertEqual(divText.text,readJson()['null'])
self.assertEqual(divText.text,readYaml()['login']['None'])
def test_login_email_format(self):
'''登陆:登陆:验证账户格式不规范的错误提示信息'''
self.driver.find_element_by_id('freename').send_keys('sdfs')
self.driver.find_element_by_id('freepassword').send_keys('sdzfas')
self.driver.find_element_by_class_name('loginBtn').click()
t.sleep(5)
divText = self.driver.find_element_by_xpath('/html/body/div[3]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[1]')
# self.assertIn(divText.text, '您输入的邮箱名格式不正确')
# self.assertIn(divText.text,readJson()['format'])
self.assertIn(divText.text,readYaml()['login']['format'])
def test_login_inButton(self):
'''登陆:验证自动登陆是否默认勾选'''
divText=self.driver.find_element_by_id('store1')
self.assertTrue(divText.is_selected())
if __name__ == '__main__':
unittest.main()
下来是对参数化进行分离
分离的脚本:
{
"login":
[
{"username":"","password":"","result":"请输入邮箱名" },
{"username":"awerty","password":"Aersde","result":"您输入的邮箱名格式不正确" },
{"username":"adsddsa@sina.com","password":"sadsdass","result":"登录名或密码错误" }
]
}
分离后的脚本:
import unittest
import time as t
from selenium import webdriver
from parameterized import parameterized,param
from 测试框架.init import Init
import json
def readJson():
return json.load(open('login_list.json',encoding='utf-8'))['login']
#首先看下是否可以读取login_list.json文件 这个是调试 以防下面代码错误 这个没有问题了 再更改下面的代码
# for item in readJsonList()['login']:
# print(item)
# print(readJsonList())
class SinaTest(Init):
@parameterized.expand([
# param('','','请输入邮箱名'),
# param('asd','123','您输入的邮箱名格式不正确'),
# param('sdfgg@sina.com','asdaqww','登录名或密码错误')
param(readJson()[0]['username'],readJson()[0]['password'],readJson()[0]['result']),
param(readJson()[1]['username'],readJson()[1]['password'],readJson()[1]['result']),
param(readJson()[2]['username'],readJson()[2]['password'],readJson()[2]['result'])
])
# 测试运行
def test_login(self,username,password,result):
# 登陆:测试登陆不同场景
self.driver.find_element_by_id('freename').send_keys(username)
self.driver.find_element_by_id('freepassword').send_keys(password)
self.driver.find_element_by_class_name('loginBtn').click()
t.sleep(3)
divTest=self.driver.find_element_by_xpath('/html/body/div[3]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[1]')
# assertEqual比较两个对象是否相等,==
self.assertEqual(divTest.text,result)
if __name__=='__main__':
unittest.main()
UnitTest测试框架
首先新建一个项目 在建项目的过程中顺便配置下加载器
项目建立完成后 在这个项目中需要建以下的包和文件
base包:基础层,主要编写底层定位元素的类
page包:对象层,编写具体的业务逻辑,把页面每一个操作行为单独的写一个方法或者是函数
test包:测试层,里面主要是测试模块
utils包:工具类
common包:公共类,这里编写公共使用到的方法
data文件夹:存储测试使用到测试数据
config文件夹:配置文件存储目录
report文件夹:测试报告目录
Readme.md
base页面脚码:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.expected_conditions import NoSuchElementException
import time as t
class WebUI(object):
def __init__(self,driver):
# webdriver实例化后的对象
self.driver=driver
def findElement(self,*args):
'''
单个元素属性的定位方式
:param args:
:return: 它是一个元组,需要带上具体什么方式定位元素属性以及元素属性的值
'''
try:
return self.driver.find_element(*args)
except NoSuchElementException as e:
return e.args[0]
def findsElement(self,*args,index):
'''
多个元素的定位
:param args:
:param index: 被定位的目标索引值
:return: 它是一个元组,需要带上具体什么方式定位元素属性以及元素属性的值
'''
try:
return self.driver.find_element(*args)[index]
except NoSuchElementException as e:
return e.args[0]
login页面脚码:
from selenium.webdriver.common.by import By
from base.base import WebUI
import time as t
class Login(WebUI):
username=(By.ID,'freename')
password=(By.ID,'freepassword')
login=(By.CLASS_NAME,'loginBtn')
divText=(By.XPATH,'/html/body/div[3]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[1]')
divTexta=(By.XPATH,'/html/body/div[3]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[2]')
def inputUserName(self,username):
t.sleep(2)
self.findElement(*self.username).send_keys(username)
def inputPasswd(self,password):
t.sleep(2)
self.findElement(*self.password).send_keys(password)
def clickLogin(self):
self.findElement(*self.login).click()
t.sleep(3)
def getDivText(self):
return self.findElement(*self.divText).text
def getDivTexta(self):
return self.findElement(*self.divTexta).text
封装:
def singLogin(self,username,password):
self.inputUserName(username=username)
self.inputPasswd(password=password)
self.clickLogin()
test_login页面脚码
from selenium import webdriver
import unittest
from page.login import Login
import time as t
class LoginTest(unittest.TestCase,Login):
def setUp(self) -> None:
self.driver = webdriver.Chrome()
self.driver.maximize_window()
self.driver.get('https://mail.sina.com.cn/')
self.driver.implicitly_wait(30)
# 清理
def tearDown(self) -> None:
self.driver.quit()
def test_login_null(self):
'''登陆验证:账户密码为空的错误提示信息'''
# self.inputUserName(username='')
# self.inputPasswd(password='')
# self.clickLogin()
self.singLogin(username='',password='')
self.assertEqual(self.getDivText(),'请输入邮箱名')
def test_login_format(self):
'''登陆验证:邮箱名格式不正确'''
# self.inputUserName(username='asdsds')
# self.inputPasswd(password='zcxca')
# self.clickLogin()
self.singLogin(username='asdsa',password='aqssds')
self.assertEqual(self.getDivText(), '您输入的邮箱名格式不正确')
def test_login_error(self):
'''登陆验证:账户密码不匹配'''
# self.inputUserName(username='asdsadacx@sina.com')
# self.inputPasswd(password='asaadfwe')
# self.clickLogin()
self.singLogin(username='sadzx@sina.com',password='assadss')
self.assertEqual(self.getDivText(),'登录名或密码错误')
t.sleep(3)
def test_login_pwnull(self):
'''登陆验证:用户名输入密码为空输出的错误提示'''
self.singLogin(username='nin@sina.com',password='')
self.assertEqual(self.getDivTexta(),'请输入密码')
t.sleep(3)
def test_login_urnull(self):
'''登陆验证:密码正常输入 用户名为空的错误提示信息'''
self.singLogin(username='',password='sdaadsw')
self.assertEqual(self.getDivText(),'请输入邮箱名')
t.sleep(3)
def test_login_urChinses(self):
'''登陆验证:在邮箱名是中文的情况错误提示信息'''
self.singLogin(username='张红@sina.com',password='adsfds')
self.assertEqual(self.getDivText(),'邮箱名不支持中文')
t.sleep(3)
def test_login_qqerror(self):
'''登陆验证:测试qq邮箱在这登陆的错误信息'''
self.singLogin(username='1721219991@qq.com',password='zcssda')
self.assertEqual(self.getDivText(),'请输入正确的新浪邮箱帐号和密码')
t.sleep(3)

浙公网安备 33010602011771号