python unittest测试框架
单元测试
单元测试需要注意什么
单元测试的时候一个大前提就是需要清楚的知道,自己要测试的程序块所预期的输入和输出,然后根据这个预期和程序逻辑来书写case。
这里的预期结果一定要针对需求/设计的逻辑去写,而不是针对程序的实现去写,否则单测就失去了意义,照着错误的实现设计出的case也很可能是错的。
总而言之,就算程序运行是正常的但是不满足功能需求也是没有意义的
单元测试框架列举及国内大厂现状
- Unittest
Python内置的标准类库。它的API跟Java的JUnit、.net的NUnit,C++的CppUnit很相似 - Pytest
丰富、灵活的测试框架,语法简单,可以结合allure生成一个炫酷的测试报告,现在比较主流 - Nose
Nose是对unittest的扩展,使得python的测试更加简单。 - Mock
unittestmock是用来测试python的库。这个是一个标准库(出现在python3.3版本以后)
单元测试覆盖率
代码覆盖率也被用于自动化测试和手工测试来度量测试是否全面的指标之一应用覆盖率的思想增强测试用例的设计。
单元测试覆盖类型:
语句覆盖
判断覆盖
条件覆盖
路径覆盖




unittest
unittest框架介绍
python自带的单元测试框架,常用在单元测试
在自动化测试中提供用例组织与执行
提供丰富的断言方法-验证函数等功能
加上HTMLTestRunner可以生成html的报告
现在依然有一些公司在用这个框架
unittest编写与规范
Unittest提供了了test casestest suites test fixtures、test runner相关的组件
编写规范
测试模块首先import unittest
测试类必须继承unittest.TestCase
测试方法必须以“test_"开头(如果没有以此开头会报Empty suite的错误)
模块名字,类名没有特殊要求
unittest测试框架的结构
如果在执行测试方法之前需要登录操作或者一些图片等资源 可以在setup方法中进行准备操作

unittest中常用的几个断言
a.相等
(a==b)内容一样,类型一致
from init import *
import unittest
class Baidu_Title(Info):
def test_baidu_title(self):
print(self.driver.title)
self.assertEqual(self.driver.title, "百度一下,你就知道")
if __name__ == "__main__":
unittest.main(verbosity=2)
b.布尔类型(bool)
assertTrue和assertFalse
例如:判断输入框是否可写
from init import *
import unittest
class Baidu_Title(Info):
def test_baidu_input(self):
su = self.driver.find_element_by_id("kw")
self.assertTrue(su.is_enabled())
# self.assertFalse(su.is_enabled())
if __name__ == "__main__":
unittest.main(verbosity=2)
c.包含
assertIn判断是否包含在里面
from init import *
import unittest
class Baidu_Title(Info):
def test_baidu_title(self):
self.assertIn("百度", self.driver.title)
if __name__ == "__main__":
unittest.main(verbosity=2)
verbosity的使用
verbosity是一个选项,表示测试结果的信息复杂度,有0、1、2 三个值
0 (静默模式): 你只能获得总的测试用例数和总的结果 比如 总共10个 失败2 成功8
1 (默认模式): 非常类似静默模式 只是在每个成功的用例前面有个“.” 每个失败的用例前面有个 “F”
2 (详细模式):测试结果会显示每个测试用例的所有相关的信息
并且 你在命令行里加入不同的参数可以起到一样的效果
加入 --quiet 参数 等效于 verbosity=0
加入--verbose参数等效于 verbosity=2
什么都不加就是 verbosity=1
测试套件
多个测试用例的集合就是测试套件,通过测试套件来管理多个测试用例
执行方法一:
unittestmain()
执行方法二:加入容器中执行 可以执行不同类的中的个别方法
suite=unittest.TestSuite()
suite.addTest(类名("方法名"))
suite.addTest(TestMethod("test_02"))
unittest.TextTestRunner().run(suite)
执行方法三:此用法可以同时测试多个类
suite1=unittest.TestLoader().loadTestsFromTestCase(类名)
suite2=unittest.TestLoader().loadTestsFromTestCase(TestCase2)
suite = unittest.TestSuite([suite1,suite2])
unittest.TextTestRunner(verbosity=2).run(suite)
执行方法四:匹配某个目录下所有以test开头的py文件,执行这些文件下的所有测试用例
test_dir="/test_case"
discover =unittest.defaultTestLoader.discover(test_dirpattern="test*.py")
discover可以一次调用多个脚本
test_dir被测试脚本的路径
pattern脚本名称匹配规则

unittest结合htmltestrunner生成带日志的测试报告
---http://tungwaiyipinfo/software/HTMLTestRunner.html
https://github.com/huilansame/HTMLTestRunner_PY3
import unittest
class demo(unittest.TestCase):
def setUp(self) -> None:
print("这是测试之前需要执行的方法")
def tearDown(self) -> None:
print("这是测试方法后面需要执行的方法")
def test_case01(self):
print("case01")
try:
self.assertEqual(int(input("请输入数字:")),2,"判断相等")
pass
except:
print("对比失败,请输正确的数字2")
class demo01(unittest.TestCase):
def test_demo01_case0(self):
print("test_demo01_case0")
def test_demo01_case1(self):
print("test_demo01_case1")
if __name__ =='__main__':
#unittest.main()
suite = unittest.TestSuite()
suite.addTest(demo01("test_demo01_case0"))
suite.addTest(demo("test_case01"))
unittest.TextTestRunner().run(suite)
浙公网安备 33010602011771号