12.7
test登录实战
from selenium import webdriver
import unittest
import time as t
class BaiduLogin(unittest.TestCase):
def setUp(self) -> None:
self.driver=webdriver.Chrome()
self.driver.maximize_window()
self.driver.get('http://www.baidu.com/')
self.driver.implicitly_wait(30)
def tearDown(self) -> None:
self.driver.quit()
def test_baidu_username_text(self):
'''百度测试:验证百度登录用户输入框的信息'''
t.sleep(3)
self.driver.find_element_by_xpath('//*[@id="s-top-loginbtn"]').click()
username=self.driver.find_element_by_id('TANGRAM__PSP_11__userName')
self.assertEqual(username.get_attribute('placeholder'),'手机号/用户名/邮箱')
def test_baidu_username_null(self):
'''百度测试:验证百度登录信息为空的错误信息'''
t.sleep(3)
self.driver.find_element_by_xpath('//*[@id="s-top-loginbtn"]').click()
self.driver.find_element_by_id('TANGRAM__PSP_11__submit').click()
divText=self.driver.find_element_by_id('TANGRAM__PSP_11__error')
t.sleep(3)
self.assertIn('请您输入手机号',divText.text)
分离测试套件
在一个自动化测试用例中,测试用例是按照业务模块来进行划分的,那么就会编写很多的模块,就会存在重复的代码。
不管是测试什么模块,测试固件这部分的代码每个测试模块都是一样的,这样就导致很多的重复的代码,比如需要修改测试的地址,就需要修改很多的测试模块,但是如果把测试套件分离出来,我们这需要修改一个地方就可以了,测试固件分离到init.py里面。
from selenium import webdriver
import unittest
class Init(unittest.TestCase):
@classmethod
def setUpClass(cls) -> None:
cls.driver=webdriver.Chrome()
cls.driver.get('https://www.baidu.com')
cls.driver.maximize_window()
cls.driver.implicitly_wait(30)
@classmethod
def tearDownClass(cls) -> None:
cls.driver.quit()
参数化
在unittest测试框架中,参数化使用的库为:parameterized
安装方式为:pip3 install parameterized
参数化:我们把相同的测试步骤,不同的测试场景,那么我们就可以使用参数化了
可以解决的问题是可以使用少量的测试代码,来覆盖更多的测试场景
参数化前
from selenium import webdriver
import unittest
import time as t
class SinaLogin(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_sinan_null(self):
'''sina邮箱验证:登录账户为空'''
self.driver.find_element_by_id('freename').send_keys('')
self.driver.find_element_by_class_name('loginBtn').click()
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_sinan_email_format(self):
'''sina邮箱验证:登录邮箱格式不正确'''
self.driver.find_element_by_id('freename').send_keys('qwert')
self.driver.find_element_by_class_name('loginBtn').click()
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_sinan_username_error(self):
'''sina邮箱验证:登录账户不匹配'''
self.driver.find_element_by_id('freename').send_keys('qwert@sina.cn')
self.driver.find_element_by_id('freepassword').send_keys('zxcvb')
self.driver.find_element_by_class_name('loginBtn').click()
t.sleep(3)
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,'登录名或密码错误')
参数化
from selenium import webdriver
import unittest
import time as t
from parameterized import parameterized,param
class SinaLogin(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()
@parameterized.expand([
param('','','请输入邮箱名'),
param('qwert','asdf','您输入的邮箱名格式不正确'),
param('qwert@sina.cn','asdfg','登录名或密码错误')
])
def test_sina_login(self,username,password,result):
self.driver.find_element_by_id('freename').send_keys(username)
t.sleep(3)
self.driver.find_element_by_id('freepassword').send_keys(password)
t.sleep(3)
self.driver.find_element_by_class_name('loginBtn').click()
t.sleep(3)
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,result)
测试报告
我们在tests的模块下编写了很多的测试用例,但是实际的生产环境中总不能按测试模块来执行,我们都是加载所有的测试模块来执行并且最终生成基于HTML的测试报告,测试报告会使用到第三方的库HTMLTestRunner
下载的地址为:https://github.com/tungwaiyip/HTMLTestRunner
把该模块需要放在lib的目录下
import unittest
import os
# HTMLTestRunner可以生成HTML的测试报告
import HTMLTestRunner
def getTests():
'''加载所有的测试模块'''
suite=unittest.TestLoader().discover(
# 找到被执行模块的路径
start_dir=os.path.dirname(__file__),
# 加载路径下所有一test_开头的测试模块的文件
pattern='test_*.py'
)
return suite
def base_dir():
return os.path.dirname(os.path.dirname(__file__))
def run():
fp=open(os.path.join(base_dir(),'report','report.htm'),'wb')
runner=HTMLTestRunner.HTMLTestRunner(
stream=fp,
title='UI自动化测试报告',
description=''
)
runner.run(getTests())
if __name__ == '__main__':
run()

测试报告文件名加入时间
import unittest
import os
# HTMLTestRunner可以生成HTML的测试报告
import HTMLTestRunner
import time
def getTests():
'''加载所有的测试模块'''
suite=unittest.TestLoader().discover(
# 找到被执行模块的路径
start_dir=os.path.dirname(__file__),
# 加载路径下所有一test_开头的测试模块的文件
pattern='test_*.py'
)
return suite
def getNowTime():
return time.strftime('%y-%m-%d %H-%M-%S',time.localtime(time.time()))
def base_dir():
return os.path.dirname(os.path.dirname(__file__))
def run():
fp=open(os.path.join(base_dir(),'report',getNowTime()+'report.htm'),'wb')
runner=HTMLTestRunner.HTMLTestRunner(
stream=fp,
title='UI自动化测试报告',
description=''
)
runner.run(getTests())

浙公网安备 33010602011771号