1.UnitTest框架css
1.1 什么是框架?
说明:
1. 框架英文单词framework
2. 为解决一类事情的功能集合
1.2 什么是UnitTest框架?
概念:UnitTest是Python自带的一个单元测试框架,用它来作单元测试。
1.3 为何使用UnitTest框架?
1. 可以组织多个用例去执行
2. 提供丰富的断言方法
3. 可以生成测试报告
1.4 UnitTest核心要素
1. TestCase
2. TestSuite
3. TestRunner
4. TestLoader
5. Fixture
2. TestCase
说明:TestCase就是测试用例
2.1 案例
定义一个实现加法操做的函数,并对该函数进行测试
2.2 定义测试用例
1. 导包:import unittest
2. 定义测试类:新建测试类必须继承unittest.TestCase
3. 定义测试方法:测试方法名称命名必须以test开头
2.3 执行测试用例
方式一:
使用pycharm在代码上点击鼠标右键,选择使用UnitTest运行
方式二:
调用 unittest.main() 来运行
思考:如何同时运行多个测试用例?
3. TestSuite
说明:(翻译:测试套件)多条测试用例集合在一块儿,就是一个TestSuite
使用:
1. 实例化:
suite = unittest.TestSuite()
(suite:为TestSuite实例化的名称)
2. 添加用例:
suite.addTest(ClassName("MethodName"))
(ClassName:为类名;MethodName:为方法名)
3. 添加扩展:
suite.addTest(unittest.makeSuite(ClassName))
(搜索指定ClassName内test开头的方法并添加到测试套件中)
提示:TestSuite须要配合TestRunner才能被执行
4. TextTestRunner
说明:TextTestRunner是用来执行测试用例和测试套件的
使用:
1. 实例化:
runner = unittest.TextTestRunner()
2. 执行:
runner.run(suite) # suite:为测试套件名称
需求
将test01.py..test10.py共10条用例,将这10条用例批量执行;
问题
1. 使用suite.addtest(unittest.makeSuite(className))导入10条测试类
2. .addtest()须要添加10次
5. TestLoader
说明:
用来加载TestCase到TestSuite中,即加载知足条件的测试用例,并把测试用例封装成测试套件。
使用unittest.TestLoader,经过该类下面的discover()方法自动搜索指定目录下指定开头的.py文件
,并将查找到的测试用例组装到测试套件;
用法:
suite = unittest.TestLoader().discover(test_dir, pattern='test*.py')
自动搜索指定目录下指定开头的.py文件,并将查找到的测试用例组装到测试套件
test_dir: 为指定的测试用例的目录
pattern:为查找的.py文件的格式,默认为'test*.py'
也可使用unittest.defaultTestLoader 代替 unittest.TestLoader()
运行:
runner = unittest.TextTestRunner() runner.run(suite)
5.1 TestLoader与TestSuite区别
1. TestSuite须要手动添加测试用例(能够添加测试类,也能够添加测试类中某个测试方法)
2. TestLoader搜索指定目录下指定开头.py文件,并添加测试类中的全部的测试方法,不能指定添加测试方法;
Fixture
1.Fixture
说明:Fixture是一个概述,对一个测试用例环境的初始化和销毁就是一个Fixture
Fixture控制级别:
1. 方法级别
2. 类级别
3. 模块级别
1.1 方法级别
使用:
1. 初始化(前置处理):
def setUp(self) --> 首先自动执行
2. 销毁(后置处理):
def tearDown(self) --> 最后自动执行
3. 运行于测试方法的始末,即:运行一次测试方法就会运行一次setUp和tearDown
1.2 类级别
使用:
1. 初始化(前置处理):
@classmethod
def setUpClass(cls): --> 首先自动执行
2. 销毁(后置处理):
@classmethod
def tearDownClass(cls): --> 最后自动执行
3. 运行于测试类的始末,即:每一个测试类只会运行一次setUpClass和tearDownClass
1.3 模块级别 [了解]
使用:
1. 初始化(前置处理):
def setUpModule() --> 首先自动执行
2. 销毁(后置处理):
def tearDownModule() --> 最后自动执行
3. 运行于整个模块的始末,即:整个模块只会运行一次setUpModule和tearDownModule
2. 案例
需求:使用UnitTest框架对tpshop项目测试
1). 点击登陆,进入登陆页面
2). 输入用户名和密码,不输入验证码,直接点击登陆按钮
3). 获取错误提示信息
2.1 示例代码
import time import unittest from selenium import webdriver class TestLogin(unittest.TestCase): def setUp(self): self.driver = webdriver.Firefox() self.driver.get("http://localhost") self.driver.implicitly_wait(10) self.driver.maximize_window() def test_login(self): # 点击登陆按钮
self.driver.find_element_by_link_text("登陆").click() # 输入用户名
self.driver.find_element_by_id("username").send_keys("13012345678") # 输入密码
self.driver.find_element_by_id("password").send_keys("123456") # 点击登陆按钮
self.driver.find_element_by_css_selector("[name='sbtbutton']").click() # 获取错误提示信息
msg = self.driver.find_element_by_css_selector(".layui-layer-content").text print("msg=", msg) def tearDown(self): time.sleep(3) self.driver.quit()
2.2 总结
1. 必须继承unittest.TestCase类,setUp、tearDown才是一个Fixture
2. setUp:通常作初始化工做,好比:实例化浏览器驱动对象、浏览器最大化、设置隐式等待等
3. tearDown:通常作结束工做,好比:关闭浏览器驱动对象、退出登陆等
断言
-
什么是断言?html
让程序代替人工去校验系统执行的结果web
-
须要掌握哪一个断言?浏览器
-
断言异常类?spa
AssertionError
-
注意:捕获到异常以后,最后经过raise
继续向外抛出异常
参数化
安装插件:
pip install parameterized
导包:
from parameterized import parameterized
使用方式:
-
方式一
@parameterized.expand([(1, 2), (2, 3), (4, 5)])
def test_add(self, x, y):
-
方式二【了解】
data = [(1, 2), (2, 3), (4, 5)]
@parameterized.expand(data)
def test_add(self, x, y):
-
方式三
# 定义到测试类的外面
def bulid_data():
# .....
retrun [(1, 2), (2, 3), (4, 5)]
@parameterized.expand(bulid_data)
def test_add(self, x, y):
跳过
对于一些未完成的或者不知足条件的测试方法或测试类能够标记成跳过,代码不会被执行
生成HTML测试报告
如何使用HTMLTestRunner生成测试报告?
-
把HTMLTestRunner.py文件复制到项目中
-
导包
from day06.tools.HTMLTestRunner import HTMLTestRunner
-
建立测试套件
-
定义测试报告文件存放的路径
report_path = './report/r20100101.html'
-
打开测试报告文件流
# 该方式会自动关闭文件流
with open(report_path, "wb") as f:
# ....
-
示例化HTMLTestRunner对象
runner = HTMLTestRunner(f, title="xxx", description="xxx")
-
执行测试套件
runner.run(suite)