1、unittest 是 Python 自带的一个单元测试框架,可以用于编写和运行单元测试。
unittest的作用是对软件中的最小可测试单元进行检查和验证,以确保每个单元的代码都能按照预期的功能和要求运行
2、在 unittest 框架中,最核心的四个概念分别是 TestCase、TestSuite、TestLoader 和 TestRunner。
- TestCase:TestCase 是 unittest 框架中的测试用例类,包含了多个测试方法和测试固件(setUp() 和 tearDown() 方法)。TestCase 子类需要继承 unittest.TestCase 并实现具体的测试方法和固件。单独一个测试方法称为一个 TestCase。
- TestSuite:TestSuite 是测试套件,可以将多个 TestCase 集合起来,作为一个整体进行运行和管理。TestSuite 支持添加和删除 TestCase,也支持嵌套其他 TestSuite。
- TestLoader:TestLoader 可以自动发现并加载指定路径下的所有 TestCase 或 TestSuite,生成一个 TestSuite 实例。TestLoader 还支持选择性地加载指定 TestCase 类或指定模块。
- TestRunner:TestRunner 是执行测试用例的组件,负责运行 TestSuite 中的所有 TestCase,并输出测试结果。unittest 内置了多种 TestRunner,例如 TextTestRunner、HTMLTestRunner 等。
3、TestCase
TestCase 是 unittest 框架中的一个核心概念,表示一个测试用例类。每个 TestCase 类包含多个测试方法(以 “test_” 开头的方法名)和测试固件(setUp() 和 tearDown() 方法),用于对被测程序进行单元测试。
创建一个 TestCase 子类非常简单,只需要继承 unittest.TestCase 并实现具体的测试方法即可。例如:
import unittest
class MyTestCase(unittest.TestCase):
def test_add(self):
self.assertEqual(1 + 2, 3)
def test_subtract(self):
self.assertEqual(5 - 2, 3)
断言
除了测试方法外,TestCase 还支持测试固件。setUp() 方法在每个测试方法执行前执行,用于初始化测试环境;tearDown() 方法在每个测试方法执行后执行,用于清理测试环境。例如:
class MyTestCase(unittest.TestCase):
def setUp(self):
self.my_list = []
def tearDown(self):
del self.my_list
def test_append(self):
self.my_list.append(1)
self.assertEqual(self.my_list, [1])
def test_pop(self):
self.my_list.append(1)
self.my_list.pop()
self.assertEqual(self.my_list, [])
在上面的代码中,我们通过 setUp() 方法创建了一个空列表 self.my_list,用于在测试方法中进行操作。在 test_append() 方法中,我们向列表中添加元素,并使用断言方法 self.assertEqual() 判断结果是否正确;在 test_pop() 方法中,我们向列表中添加元素,再从列表中弹出元素,并使用断言方法判断结果是否正确。同时,我们通过 tearDown() 方法清理测试环境,删除列表对象 self.my_list。
TestFixure脚手架
TestFixure脚手架是一种测试技术,用于为测试用例提供一致的测试环境和数据1。TestFixure可以在不同的层级上使用,如用例级别、类级别和模块级别2。
4、TestSuite
TestSuite(测试套件)是 unittest 框架中用于组织和运行测试用例的容器。一个 TestSuite 可以包含多个 TestCase 子类实例或其他 TestSuite 实例,用于组织和执行一组相关的测试用例。
创建一个 TestSuite 非常简单,只需要实例化 unittest.TestSuite 并使用 addTest() 方法添加要运行的 TestCase 或其他 TestSuite 实例即可,也可以使用 addTests() 方法以列表的形式添加多个。例如:
suite = unittest.TestSuite()
# 方式一
suite.addTest(CountTest('test_add'))
suite.addTest(CountTest('test_sub'))
# 方式二
suite.addTests([CountTest('test_add'),CountTest('test_sub')])
使用TestLoader添加测试用例
使用TestLoader添加测试用例是一种在unittest模块中组织和管理测试用例的方法1。TestLoader是一个类,可以从不同的来源加载测试用例,如类、模块、名称等,并返回一个TestSuite对象2。
5、TestRunner
TestRunner 是 Python 中 unittest 模块中的一个类,用于运行测试用例并生成测试报告。主要使用HTMLTestRunner类调用run()方法生成HTML测试报告。
http://tungwaiyip.info/software/HTMLTestRunner.html
6、实例
主要实现获取哔哩哔哩入站必刷视频的标题、播放量和点赞数
逻辑操作部分
from time import sleep
from webdriver.getDriver import Driver
from selenium import webdriver
class Bili:
def getTitle(self):
# driver = Driver.getDriver()
driver = webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(10)
driver.get("https://bilibili.com")
driver.find_element_by_xpath("//div[@class='channel-icons']/a[2]").click()
# 忘记了获取浏览器所有标签页的句柄
handles = driver.window_handles
driver.switch_to.window(handles[-1])
# 使用了xpth和css来定位元素
# driver.find_element_by_css_selector("img[src='//s1.hdslb.com/bfs/static/jinkela/popular/assets/icon_history.png']").click()
driver.find_element_by_xpath("//div[@class='nav-tabs']/div[3]").click()
sleep(2)
titles = driver.find_elements_by_xpath("//div[@class='video-card']//p")
for item in titles:
print(item.text)
return driver.title
测试用例部分
import unittest
from pages.test import Bili
class Tiltle(unittest.TestCase):
def test_title(self):
title = Bili().getTitle()
self.assertEqual(title, "哔哩哔哩入站必刷")
生成测试报告部分
import unittest
from common.HTMLTestReportCN import HTMLTestRunner
import os
import time
report_path = "./report/"
report_title = "Bilibili测试"
report_descript = "本次测试是对bilibili测试"
if not os.path.exists(report_path):
os.mkdir(report_path)
gettime = time.strftime("%Y%m%d%H%M%S")
# print(gettime)
filepath = report_path + f"report{gettime}.html"
suite = unittest.TestLoader().discover(start_dir="./test_case", pattern="test_*case.py")
with open(filepath, "wb") as f:
runner = HTMLTestRunner(f,title=report_title,description=report_descript)
runner.run(suite)
测试报告