unittest测试框架之解读

一:单元测试框架应用及说明
Unittest是Python语言的单元测试框架,UnitTest单元测试框架提供了创建测试用例,测试套件,和批量执行测试用例的方法,可以用于单元自动化测试(模块)、接口自动化测试(接口)、功能自动化测试(UI)等等。

二:Unttest框架的4个重要概念

(1)test fixture(测试固件/夹具):专用于测试执行前的准备工作和测试结束后的清理工作,例如:创建数据库链接、关闭数据库链接、启动服务进程、测试环境的清理等。

# setUp():准备环境,执行每个测试用例的前置条件;
# tearDown():环境还原,执行每个测试用例的后置条件;
# setUpClass():必须使用@classmethod装饰器,所有case执行的前置条件,只运行一次;
# tearDownClass():必须使用@classmethod装饰器,所有case运行完后只运行一次;

(2)test suite(测试套件):一个测试套件是一组测试用例的集合,它的作用是将测试用例集合到一起一次性执行集合中所有的测试用例。
(3) test case(测试用例):一个测试用例是一个完整的测试流程,是最小的测试单元,通常会继承unittest.TestCase类。
(4) test runner(测试运行器):一个测试运行器执行设定的测试用例并将测试结果反馈给用户两部分功能组成。

知识要点:

# TestCase 测试用例以"test"开头命名。
# 类,必须要继承unittest.TestCase
# 一个类class继承 unittest.TestCase,就是一个测试用例。一个TestCase的实例就是一个测试用例,就是一个完整的测试流程。
# 包括测试前环境准备setUp()|setUpClass()、执行代码run()、测试环境后的还原
例子:test_dialog.py

from selenium import webdriver
import unittest
class Test_dialog(unittest.TestCase):
#  类,必须要继承unittest.TestCase
#  一个类class继承 unittest.TestCase,一个TestCase的实例就是一个测试用例,就是一个完整的测试流程。
#  unnitest完整测试流:包括测试前环境准备setUp()|setUpClass()、执行代码run()、测试环境后的还原tearDown()|tearDownClass()。
#  继承自unittest.TestCase的类中,测试方法的名称要以test开头。且只会执行以test开头定义的方法(测试用例)。

@classmethod
def setUpClass(cls):
print("测试执行前的环境准备工作,如数据库链接、启动服务进程等")
@classmethod
def tearDownClass(cls):
print("测试执行后的环境清理工作,如数据库链接关闭、关闭服务进程等")
def setUp(self):
print("do something befor test.prepare environment")
self.browser = webdriver.Chrome()
self.browser.get("file:///d:/user/01399473/desktop/1/1.html")
def tearDown(self):
print("do something after test.Clean up")
self.browser.quit()
def test_alertAccept(self):
self.browser.find_element_by_id("alert").click()
alert=self.browser.switch_to_alert()
print(alert.text)
#点击确定按钮
alert.accept()

def test_confirmDialog(self):
self.browser.find_element_by_id("confirm").click()
confirm = self.browser.switch_to_alert()
print(confirm.text)
confirm.accept()

def test_dismissDialog(self):
self.browser.find_element_by_id("confirm").click()
confirm = self.browser.switch_to_alert()
print(confirm.text)
confirm.dismiss()

def test_promptDialog(self):
self.browser.find_element_by_id("prompt").click()
prompt = self.browser.switch_to_alert()
print(prompt.text)
prompt.accept()

if __name__ == '__main__':
unittest.main()

备注:分析上面的代码
1、首先引入unittest模块,创建test_dialog测试类并继承unittest的TestCase类,我们可以把TestCase类看成是对特定类进行测试的集合
2、unittest提供了全局main()方法,使用它可以方便地将一个单元测试模块变成可以直接运行的测试脚本。main()方法使用TestLoader类来搜索所有包含在该模块中以"test"命名开头的测试方法,并自动执行它们
3、在unittest.main()中加 verbosity 参数可以控制输出的错误报告的详细程度,默认是 1,如果设为 0,则不输出每一用例的执行结果,即没有上面的结果中的第1行;如果设为 2,则输出详细的执行结果


三:单元测试的执行

第一种方法:

在unittest单元测试框架中,提供两种单元测试加载执行测试用例的方法:

(1)直接通过unittest.main()方法加载并执行当前py文件中的测试用例。这是一种最简单的加载方法,所有的测试方法执行顺序都是按照方法名字符串所表示的ASCII码升序排序(数字与字母的顺序为:0-9,A-Z,a-z)

第二种方法:构造测试集,执行测试用例
例子:test_suite.py

import unittest
from class_02 import test_dialog
from HTMLTestRunner import HTMLTestRunner

if __name__ == '__main__':
#创建一个测试套件
suite = unittest.TestSuite()
#实例化用例类
test_ops = test_dialog.Test_dialog
#方式1,添加单条测试用例
test_case1 = test_ops("test_alertAccept")
test_case2 = test_ops("test_confirmDialog")
suite.addTest(test_case1)
suite.addTest(test_case2)
#方式2,一次添加多条测试用例
test_cases = [test_ops("test_alertAccept"), test_ops("test_confirmDialog"), test_ops("test_dismissDialog"),
test_ops("test_promptDialog")]
suite.addTests(test_cases)
#方式3,添加一个测试用例类
loader = unittest.TestLoader()
suite.addTest(loader.loadTestsFromTestCase(test_dialog.Test_dialog))
#方式4,添加一个模块
loader = unittest.TestLoader()
suite.addTest(loader.loadTestsFromTestCase(test_dialog))
# 方式5,指定测试用例的所在的目录路径,进行加载
loader = unittest.TestLoader()
suite.addTest(loader.discover(start_dir=r"D:\Python Project\DailyExercise2\class_02", pattern="test_dia*.py")) ## 匹配规则:所有以test_case开头的,此处指定去匹配test_dialog.py
# runner = unittest.TextTestRunner(verbosity=2)
# runner.run(suite)

# # 在同目录下生成txt格式的测试报告
# with open('UnittestTextReport.txt', 'w') as f:
# runner = unittest.TextTestRunner(stream=f, verbosity=2)
# runner.run(suite)

# 创建测试运行程序启动器
# runner = HTMLTestRunner.HTMLTestRunner(stream=open("report.html", "wb"), # 打开一个报告文件,将句柄传给stream
# description="弹窗页面测试报告", # 报告中显示的描述信息
# title="自动化测试报告",verbosity = 2) # 报告的标题

with open('HTMLReport.html', 'wb') as f:
runner = HTMLTestRunner.HTMLTestRunner(stream=f,
title=u'弹窗页面测试报告',
description=u'测试用例的执行情况',
verbosity=2
)

# 使用启动器去执行测试套件里的用例
runner.run(suite)

四:测试断言

ssertEqual(a,b),asserTrue(),assertIn为常用断言方法。

assertEqual(a,b)用于判断两个字符串是否相等。

assertTrue(x)用于断言一个字符串是否在页面资源。

assertIn(a,b)用于判断一个jsp或php页面在当前页面地址中

五:测试报告的生成

(1)Unnitest自带的text报告
(2)HTMLTestRunner报告
(3)BeautifulReport

 

 

 

 



 

 

 

 

 

 




 

posted @   xiaowangzi3668  阅读(81)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示