咳咳,今天进入正题~
这两天我学习了 Python的测试代码,对于自己编写的程序,要有一定的测试能力,保证其能够平稳的运行下去,那么 我们就需要用到一系列的测试方法,这里我学习了Python自带的单元测试方法,比较简单,下面开始举栗子:
1.我们先准备一个测试代码,被测试的方法:
# coding = utf8
import os
os.path.abspath(".")
"""
Python - 测试代码
"""
class test_class_test():
def __init__(self, first_name, last_name):
self.first_name = first_name
self.last_name = last_name
# 原函数
def test_name(self):
return self.first_name + " " + self.last_name
if __name__ == "__main__":
pass
2.执行一个简单的断言测试:
# coding = utf8
import os
os.path.abspath(".")
import unittest
from test_class import test_class_test
"""
该函数为单元测试用例
1.当执行unittest.main() 后,所有包含test开头的函数都会执行
2.使用setUp()函数来初始化测试用例所需的属性、对象等
"""
class test_assert_class_test(unittest.TestCase):
def setUp(self):
self.test_class_test_obj = test_class_test("cgt", "tangtang")
def test_test_name(self):
get_name = self.test_class_test_obj.test_name()
# 执行断言测试
self.assertEqual(get_name, "cgt tangtang")
if __name__ == "__main__":
unittest.main()
3.创建一个实体类,对其方法进行测试:
# coding = utf8
"""
单元测试用例练习:
编写一个名为employee_test的类,其方法__init__()接收名、姓、年薪,
并将它们都存储在属性中。编写一个名为give_raise()的方法,它默认将年薪增加5000美元,
但也能够接受其他的年薪增加量
为employee_test编写一个测试用例,其中包含两个测试方法:test_give_default_raise()
和test_give_custom_raise()。使用方法setUp(),以免在每个测试方法中都创建employee的实例。
运行这个测试用例,确认两个测试都通过了
"""
import os
os.path.abspath(".")
class employee_test_class():
def __init__(self, first_name, last_name, annual_salary):
self.first_name = first_name
self.last_name = last_name
self.annual_salary = annual_salary
def give_raise(self, increase_annual_salary = 5000):
self.annual_salary += increase_annual_salary
return self.annual_salary
if __name__ == "__main__":
pass
4.使用测试用例对employee实体类进行测试:
# coding = utf8
import os
os.path.abspath(".")
import unittest
from employee_test import employee_test_class
"""
employee_test的单元测试用例
"""
class employee_unittest_case(unittest.TestCase):
def setUp(self):
self.employee_test_class_obj = employee_test_class("cgt", "tangtang", 19999)
def test_give_default_raise(self):
default_annual_salary = self.employee_test_clas
s_obj.give_raise()
self.assertEqual(default_annual_salary, 24999)
def test_give_custom_raise(self):
custom_annaul_salary = self.employee_test_class_obj.give_raise(1)
self.assertEqual(custom_annaul_salary, 20000)
if __name__ == "__main__":
unittest.main()
5.一个完善的单元测试结构:
# coding = utf8
import os
os.path.abspath(".")
import unittest
import sys
"""
之前是对于测试用例的结构的介绍与用法的实践,
现在对完整的单元测试结构与用法进行学习
Python - Unittest(Detail & Important)
1、unittest主要功能模块介绍
unittest主要包含TestCase、TestSuite、TextTestRunner、TextTestResult几个功能模块:
- TestCase:一个TestCase实例就是一个测试用例,一个测试用例就是一个完整的测试流程,包括测试前环境的搭建
,测试代码的执行,以及测试后环境的还原或者销毁。(元测试的本质也在这里,一个测试用例是一个完整的测试单元,
可以对某一个具体问题进行检查验证。)
- TestSuite:多个测试用例集合在一起就是TestSuite,TestSuite也可以嵌套TestSuite
- TestLoader:TestLoader的作用是将TestCase加载到TestSuite中
- TextTestRunner:TextTestRunner是用来执行测试用例的,其中run(test)会执行TestSuite/TestCase中的
run(result)方法
- TextTestResult:TextTestResult用来保存测试结果,其中 包括运行了多少测试用例,成功了多少、失败了多少等信息
整个测试流程:
写好TestCase,然后由TestLoader加载TestCase到TestSuite,然后由TextTestRunner来运行TestSuite,运行的结果
保存在TextTestResult中
"""
class unittest_structure_class():
def __init__(self):
pass
# 准备几个待测的方法
def add(self, a, b):
return a + b
def multi(self, a, b):
return a * b
# 测试用例类
class testFunc(unittest.TestCase):
# setUp()和tearDown()会在每个case执行前后都执行一次
def setUp(self):
print("Do something before test, like prepare step:>>>>>>")
self.func_class = unittest_structure_class()
# 使用装饰器对该测试用例进行跳过
@unittest.skip("I use decorator to skip this method")
def test_add(self):
self.assertEqual(3, self.func_class.add(1, 2))
def test_multi(self):
# 使用skipTest()跳过当前测试用例
self.skipTest("I'm skipped by unittest method unittest.SkipTest()")
self.assertEqual(6, self.func_class.multi(2, 3))
def tearDown(self):
print("Do something after test, clean something:>>>>>>")
del self.func_class
# setUpClass()和tearDownClass()会在当前所有Case执行前后执行一次,根据测试需求,选择setUp()/setUpClass()
@classmethod
def setUpClass(self):
print("This setUpClass method only run once before run all test case>>>>>>")
@classmethod
def tearDownClass(self):
print("This setUpClass method only run once after run all test case>>>>>>")
if __name__ == "__main__":
# 加上verbosity=参数控制输出的错误报告和详细程序 -- 默认为1,如果设为0:则不输出执行结果,设为2:输出详细的执行结果
# unittest.main(verbosity=2)
'''
TestSuite添加用例的几种类型:
'''
# 1、使用TestSuite完善case执行顺序、进行计划性对测试用例进行测试
suite = unittest.TestSuite()
tests = [testFunc("test_add"), testFunc("test_multi")]
suite.addTests(tests)
# 将测试结果输出保存到本地
with open("./Study/out.txt", "w+") as f:
runner = unittest.TextTestRunner(stream=f, verbosity=2)
runner.run(suite)
# 2、直接使用addTest()添加单个Case
suite.addTest(testFunc("test_add"))
## 使用loadTestFromName,传入模块名.TestCase名,下面俩方法效果相同
suite.addTests(unittest.TestLoader().loadTestsFromName("test_add"))
suite.addTests(unittest.TestLoader().loadTestsFromNames(["test_add"]))
# loadTestsFromTestCase(),传入TestCase
suite.addTests(unittest.TestLoader().loadTestsFromTestCase(testFunc))
6.输出结果至文件中:
test_add (__main__.testFunc) ... skipped 'I use decorator to skip this method'
test_multi (__main__.testFunc) ... skipped "I'm skipped by unittest method unittest.SkipTest()"
----------------------------------------------------------------------
Ran 2 tests in 0.000s
OK (skipped=2)
不要着急~,因为总会有人熬夜陪你 下雨接你 说我爱你 好的总是压箱底