二、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函数实现两个加数加法计算功能,最后把结果用返回值返回。
示例:day07cal.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数据等步骤。
示例:
1 def test_1(self): 2 self.driver.get("http://localhost/upload/index.php") 3 guan=self.driver.find_element(By.ID,"keyword") 4 guan.send_keys("a") 5 sou=self.driver.find_element(By.CLASS_NAME,"go") 6 sou.click()
(6)运行时,把光标放在代码末尾,右击菜单里选择Run Unittests……