UnitTest测试框架
1、测试用例
2、完整的测试流程需包含:
初始化
测试步骤
(1)、先执行setup()
(2)、执行测试点的代码
(3)、最后执行tearDown()
测试断言
(1)、in 关键字:assertIn
(2)、== 关键字:assertEqual
(3)、assertTrue/assertFalse
测试清理
3、规则
(1)、必须是以test开头的
(2)、每个测试点必须有标题
(3)、每个测试点必须有断言
(4)、测试点的名称不能一致
4、实战
需求:以新浪邮箱登录为例,验证自动登录的勾选以及用户名为空的出错信息
import unittest
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
#新浪登录
class TestSina(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)
(1)、使用in断言用户名为空的错误信息
def test_sina_username(self):
'''验证用户名为空的错误提示信息'''
self.driver.find_element(By.CLASS_NAME, 'loginBtn').click()
time.sleep(2)
divText = self.driver.find_element(By.XPATH,'/html/body/div[1]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[1]').text
self.assertIn(divText,'请输入邮箱名')
(2)、使用==断言用户名为空的错误信息
def test_sina_username(self):
'''验证用户名为空的错误提示信息''' self.driver.find_element(By.CLASS_NAME,'loginBtn').click()
time.sleep(2)
divText=self.driver.find_element(By.XPATH,'/html/body/div[1]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[1]').text
self.assertEqual(divText,'请输入邮箱名')
(3)、使用assertTrue/assertFalse断言自动登录有无勾选
def tests_isAuto_login(self):
'''验证自动登录已勾选'''
isLogin=self.driver.find_element(By.ID,'store1')
time.sleep(2)
#真真
self.assertTrue(isLogin.is_selected())
def tests_isAuto_login1(self):
'''验证自动登录没有被勾选'''
#假假
isLogin = self.driver.find_element(By.ID, 'store1')
isLogin.click()
time.sleep(2)
self.assertFalse(isLogin.is_selected())
# 清理
def tearDown(self) -> None:
self.driver.close()
if __name__ == '__main__':
unittest.main()
5、测试套件/输出测试报告
(1)、TestSuite:
执行测试套件(查找到符合要求的测试用例来执行)
把所有的测试模块放在测试套件里面来进行批量的执行
(2)、输出报告
unittest+HTML TestRunner 来生成HTML的测试报告
(3)、实战
需求:将所有的测试用例进批量执行,并将结果输出为报告至testDev下的report文件夹内
注意:所有测试用例需与测试套件的模块在同级目录下
import unittest
import os
import HTMLTestRunner
#加载所有的测试模块
def allTests():
'''使用测试套件加载所有的测试模块'''
suite=unittest.TestLoader().discover(
#查找路径
start_dir=os.path.dirname(__file__),
#查找所有的模块
pattern='test_*.py')
return suite
def base_dir():
return os.path.dirname(os.path.dirname(__file__))
def run():
filename=os.path.join(base_dir(),'report','report.html')
fp=open(filename,'wb')
runner=HTMLTestRunner.HTMLTestRunner(
stream=fp,
title='自动化测试报告',
description='UI自动化测试报告')
runner.run(allTests())
if __name__ == '__main__':
run()
结果:
6、参数化
unittest参数化
用到的库:pip3 install parameterized
参数化:相同的测试步骤,不同的测试数据,那么这样的场景可以使用参数化,使用参数化可以有效的提升测试的效率
#使用参数化对新浪邮箱登录的的三个测试场景进行参数化
import unittest
from selenium import webdriver
from selenium.webdriver.common.by import By
import time as t
from parameterized import param,parameterized
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.close()
class TestSina(Init):
@parameterized.expand([
param('','','请输入邮箱名'),
param('asdert','','您输入的邮箱名格式不正确'),
param('[email protected]','sadsd','登录名或密码错误')
])
def test_sina_login_param(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)
divText = self.driver.find_element(By.XPATH,'/html/body/div[1]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[1]')
self.assertEqual(divText.text,result)
if __name__ == '__main__':
unittest.main()