unittest测试框架(11)

二、unittest测试框架
1.unittest原名PyUnit,是Python语言自带的单元测试框架。Selenium WebDriver功能自动化测试和Appium手机自动化测试和接口测试都可以继承unittest框架来管理代码。
2.集成unittest框架的原因:
(1)在一个unittest的测试用例脚本文件里可以包含多个测试用例代码实现内容,可以统一管理,方便维护。
(2)可以批量运行。
(3)实现代码的复用。
(4)有大量的日志。
(5)提供了很多断言方法,利用它们检查界面上的数据。
(6)测试结果报告展示得更清晰明了。
3.用unittest框架做单元测试的步骤:
(1)被测模块:day07包里的cal.py,新建Cal类,定义构造函数传入两个属性值代表两个加数,定义add函数实现两个加数加法计算功能,最后把结果用返回值返回。
示例:day07\cal.py
class Cal():
def __init__(self,x,y): --注意构造函数不要写错!
self.x=x
self.y=y
def add(self):
return self.x+self.y
(2)设计单元测试的测试用例:
用例1:x=20 y=30,检查add函数能返回预期值50
用例2:x=-100 y=-10 检查add函数能返回预期值-110
用例3:x=1.3 y=2.1 检查add函数能返回预期值3.4
……
(3)实现单元测试的测试代码:在day07包上右击菜单里选择New---Python file,选择文件类型是Python unit test,输入文件名称testcal,OK,自动生成了一些代码。
示例:
# 导入unittest模块
import unittest
# 定义一个类,默认类名是MyTestCase(可修改),该类是unittest模块里的TestCase类的子类。
class MyTestCase(unittest.TestCase):
# 以test开头命名的函数,叫做测试函数,至少要有1个
def test_something(self):
# 调用父类TestCase里提供的断言方法来检查数据。
self.assertEqual(True, False)
# 判断当前脚本代码没有被其他模块调用,自己独立运行时,一般在这个分支时,写测试代码来测试当前模块。
if __name__ == '__main__':
# 调用unittest模块里的main函数(程序执行入口),该函数会自动帮我们来实例化上面的测试用例类,并且自动依次调用所有测试函数。
unittest.main()
(4)在测试代码(testcal.py)开头处导入被测模块里的被测类(cal.py里Cal类)。
from day07.cal import Cal
(5)每一条测试用例准备一个测试函数:比如有3条测试用例,就需要准备3个测试函数,实例化被测类,调用被测函数,接收返回来的数据,用父类里提供的断言方法检查该数据是否符合预期要求。
示例:
def test_1(self): ---test开头的函数就是测试函数
c1=Cal(20,30) ---实例化被测类
r1=c1.add() ---调用被测函数,接收返回来的数据
self.assertEqual(50, r1) ---检查返回值
def test_2(self):
c2=Cal(-100,-10)
r2=c2.add()
self.assertEqual(-110,r2)
def test_3(self):
c3=Cal(1.3,2.1)
r3=c3.add()
self.assertAlmostEqual(3.4,r3,2)
(6)运行代码时,建议把光标定位在代码末尾,右击菜单里选择Run Unittests……来运行,这样此类里所有测试函数都会参与运行。
(7)补充:在每个测试函数执行前,如果都需要做相同的准备工作,可以把这样的步骤写在名称为setUp的函数里,在每个测试函数执行后,如果都需要做相同的收尾工作,可以把这样的步骤写在名称为tearDown的函数里。这样运行时按照setUp---test_xxx---tearDown---setUp---test_yyy---tearDown……这样的顺序来运行。
示例:
def setUp(self):
print("做准备工作,例如打开数据库连接、打开外部文件等")
def tearDown(self):
print("做清理和收尾工作,例如关闭数据库连接、关闭外部文件等")
4.用unittest框架做Selenium WebDriver测试的步骤:
(1)案例:
用例1:启动Firefox,打开ECShop前台首页,输入关键字a,点击搜索,等待3秒,关闭浏览器
用例2:启动Firefox,打开ECShop前台登录页,输入用户名abc和密码123,点击“立即登陆”,等待3秒,关闭浏览器
用例3:启动Firefox,打开ECShop前台留言板页,输入电子邮件地址lisi@123.com,点击“我要留言”,等待3秒,关闭浏览器。
……
(2)新建day07包里的case7004.py,选择文件类型是Python unit test,导入selenium相关资源:
示例:
from selenium import webdriver
from time import sleep
from selenium.webdriver.common.by import By
(3)在该类里定义名称是setUp的函数,在该函数体里写启动Firefox和隐式等待的步骤。
注意:driver变量想要在整个类里使用,必须加self.
示例:
def setUp(self):
self.driver=webdriver.Firefox()
self.driver.implicitly_wait(15)
(4)在该类里定义名称是tearDown的函数,在该函数体里写等待和关闭浏览器的步骤。
示例:
def tearDown(self):
sleep(3)
self.driver.quit()
(5)按照测试用例数,创建多个测试函数,每个测试函数中书写打开xxx网页、定位xxx元素、操作xxx、检查xxx数据等步骤。
示例:
def test_1(self):
self.driver.get("http://localhost/upload/index.php")
guan=self.driver.find_element(By.ID,"keyword")
guan.send_keys("a")
sou=self.driver.find_element(By.CLASS_NAME,"go")
sou.click()
(6)运行时,把光标放在代码末尾,右击菜单里选择Run Unittests……
5.unittest框架里的常用断言方法:用于检查数据。
(1)assertEqual(x,y) 检查两个参数类型相同并且值相等。
(2)assertTrue(x) 检查唯一的参数值等于True
(3)assertFalse(x) 检查唯一的参数值等于False
(4)assertIn(x,y) 检查x被包含在y里
(5)assertAlmostEqual(x,y,z) 检查指定精度的两个浮点数相等,第三个参数z代表精确到小数点后几位(是可选参数)。
6.selenium中获得界面上的实际数据并检查它们:
(1)获得当前浏览器窗口里的当前网页的标题(self.driver.title)来检查,主要用于检查网页是否跳转到目标页。
示例:
# 检查跳转到标题包含“系统提示”的网页
t1=self.driver.title
self.assertIn("系统提示",t1)
sleep(8)
# 检查自动跳转到标题以“用户中心”开头的网页
t2=self.driver.title
b1=t2.startswith("用户中心")
self.assertTrue(b1)
(2)检查当前浏览器窗口里的当前网页源代码(driver.page_source)里包含某文本,一般用于网页出现时间较短,无法调查元素的定位条件时检查网页里的文本信息。
示例:
# 检查网页源代码里包含“用户名或密码错误”
p1=self.driver.page_source
self.assertIn("用户名或密码错误",p1)
(3)检查指定元素里文本等于某值:定位到元素后,使用元素对象的text属性就可以获得该元素的开始和结束标记之间的文本,然后就可以检查文本是否正确。
示例:
# 检查默认用户名数据是否是“匿名用户”
lie2=self.driver.find_element(By.XPATH,"//tr[1]/td[2]")
t1=lie2.text# <td>匿名用户</td>
self.assertEqual("匿名用户",t1)

上一篇:web(ui)自动化测试


下一篇:多测师讲解 _ Unittest框架_高级讲师肖sir(unittest002)