一.单元测试基础
1.单元测试是什么
单元测试一般是针对某个模块,或者开发出来的某个类,某一个部分进行测试,做单元测试,可以从代码的层次对程序检测,从编码的方面提前发现bug,进行bug定位。
我们做单元测试可以来测试自己的代码,以及利用单元测试完成自动化项目
2.模块
unittest
pytest
3.测试用例
- 测试用例+期望结果excepted
- 执行测试
- 测试结果:使用assert断言:实际结果和期望结果进行比对
- 测试报告
二.编写用例类
1.用例环境
# 重写这两个函数
# 测试准备环境,在每条用例执行之前调用
def setUp(self):
print("start testing")
# 测试清除环境,在每条用例执行之前调用
def tearDown(self):
print("end testing")
2.编写测试用例
a.右键点击对应的测试用例执行会把函数当成用例执行,先执行setup,最后执行teardown
def test_001_add_positive(self):
a = 1
b = 2
c = a+b
print("测试结果是{}".format(c))
执行顺序按照ASCII编码字符的顺序执行,建议命名如示例
b.用例增加断言,并抛出异常
def test_002_add_negative(self):
a = -1
b = -2
c = a+b
expected = -2
try:
self.assertEqual(expected, c)
except AssertionError as e:
print("报错了错误是{}".format(e))
raise e
print("测试结果是{}".format(c))
编写用例代码
import unittest
class TestAdd(unittest.TestCase):
# 重写这两个函数
# 测试准备环境,在每条用例执行之前调用
def setUp(self):
print("start testing")
# 测试清除环境,在每条用例执行之前调用
def tearDown(self):
print("end testing")
# 编写用例,一定要以test开头(unittest模块约定),一个函数代表一个用例
def test_001_add_positive(self):
a = 1
b = 2
c = a+b
expected = 4
try:
self.assertEqual(expected,c)
except AssertionError as e:
print("报错了错误是{}".format(e))
print("测试结果是{}".format(c))
def test_002_add_negative(self):
a = -1
b = -2
c = a+b
expected = -2
try:
self.assertEqual(expected, c)
except AssertionError as e:
print("报错了错误是{}".format(e))
print("测试结果是{}".format(c))
def test_003_add_zero(self):
a = 0
b = 0
c = a+b
expected = 1
try:
self.assertEqual(expected, c)
except AssertionError as e:
print("报错了错误是{}".format(e))
print("测试结果是{}".format(c))
三.执行用例
使用另外一个py文件,导入测试类
import unittest
from preview.py_unittest.py_unittest import *
'''添加用例TestSuite'''
# 创建测试套件,用于收集存储用例
suite = unittest.TestSuite()
# 测试用例的实例
suite.addTest(TestAdd("test_001_add_positive"))
suite.addTest(TestAdd("test_002_add_negative"))
'''执行用例TestTextRunner'''
runner = unittest.TextTestRunner()
runner.run(suite)
1.TextTestRunner:
runner = unittest.TextTestRunner(stream=None, descriptions=True, verbosity=1)
- stream 参数表示结果输出的位置,这里可以改成结果文件,如下
with open("test.txt","w") as file:
runner = unittest.TextTestRunner(stream=file, descriptions=True, verbosity=1)
runner.run(suite)
- verbosity 参数表示结果的详细程度,从0到2,数字越大结果越详细
2.加载用例
方式1:通过测试用例添加
suite.addTest(TestAdd("test_001_add_positive"))
suite.addTest(TestAdd("test_002_add_negative"))
方式2:通过测试类来添加用例
loader =unittest.TestLoader()
suite.addTest(loader.loadTestsFromTestCase(TestAdd))
方式3:通过模块来添加
对应的导入模块也要变化
import unittest
from preview.py_unittest import unit_test
loader =unittest.TestLoader()
suite.addTest(loader.loadTestsFromModule(unit_test))
执行用例代码
import unittest
from preview.py_unittest.unit_test import *
'''添加用例TestSuite'''
# 创建测试套件,用于收集存储用例
suite = unittest.TestSuite()
'''加载用例方式2'''
loader =unittest.TestLoader()
suite.addTest(loader.loadTestsFromTestCase(TestAdd))
'''执行用例TestTextRunner'''
with open("test.txt","w") as file:
runner = unittest.TextTestRunner(stream=file, descriptions=True, verbosity=1)
runner.run(suite)
四.结果分析
1.控制台输出
..
----------------------------------------------------------------------
Ran 2 tests in 0.000s
OK
第一行:
- 点.表示一条用例测试通过,这里表示两条用例测试通过,有两个点
- E表示一条用例报错,error
- F表示一条用例测试未通过,fail
2.测试报告
HTMLTestRunnerNew模块(模块网盘)
def __init__(self, stream=sys.stdout, verbosity=2,title=None,description=None,tester=None):
- stream:报告输出的位置
- verbosity:报告详细等级
- title=None
- description=None
- tester=None
import unittest
from preview.py_unittest . unit_test import *
from preview.py_unittest import HTMLTestRunnerNew
'''添加用例TestSuite'''
# 创建测试套件,用于收集存储用例
suite = unittest.TestSuite()
suite.addTest(TestAdd("test_001_add_positive"))
suite.addTest(TestAdd("test_002_add_negative"))
suite.addTest(TestAdd("test_003_add_zero"))
'''执行用例TestTextRunner'''
with open("test0304.html","wb") as file:
runner = HTMLTestRunnerNew.HTMLTestRunner(stream=file,verbosity=2,title="20190307",description="描述信息",tester="Ben")
runner.run(suite)
五.断言
断言类型整理
断言语法 | 解释 |
---|---|
assertEqual(a,b) | 判断a==b |
assertNotEqual(a,b) | 判断a!=b |
assertIs(a,b) | a is b(内存地址) |
assertIsNone(a,b) | 判断结果是否为空 |