单元测试
单元测试 是白盒测试,主要是代码层面的测试,需要知道输入和输出来进行测试,一般是开发人员来做
单元测试覆盖
语句覆盖
条件覆盖
判断覆盖
路径覆盖
unittest框架
test fixture? 测试前置或后置条件
test suites? 测试的套件 类似于测试用例集
test cases? 测试用例
test runner? 测试执行
编写规范
? ? ? ? 测试模块首先 import unittest
????????测试类必须继承 unittets.Test.Case
? ? ? ? 测试方法必须以 test_开头
setUp用来做测试前置条件,tearDown用来做测试后置条件
常用于数据库的连接与断开连接
如果有些测试用例需要跳过,可以使用@unittest.skip
代码示例
import unittest
class TestStringMethods(unittest.TestCase):
def setUp(self) -> None: # 每一条测试用例开始前执行
print("setup")
def tearDown(self) -> None: # 每一条测试用例结束后执行
print("teardown")
@classmethod
def setUpClass(cls) -> None: # 此类的所有测试执行前执行一次
print("setupcls")
@classmethod
def tearDownClass(cls) -> None: # 此类的所有测试执行后执行一次
print("teardowncls")
def test_upper(self):
print("upper success 111")
self.assertEqual('foo'.upper(), 'FOO')
def test_isupper(self):
print("isupper success 222")
self.assertTrue('FOO'.isupper())
self.assertFalse('Foo'.isupper())
def test_split(self):
print("split success 333")
s = 'hello world'
self.assertEqual(s.split(), ['hello', 'world'])
# check that s.split fails when the separator is not a string
with self.assertRaises(TypeError):
s.split(2)
if __name__ == '__main__':
unittest.main()
import unittest
class Search:
def search_func(self):
print("search")
return True
class TestSearch(unittest.TestCase):
@classmethod
def setUpClass(cls) -> None:
cls.s = Search() # 在整个类的测试执行前 实例化被测类
def test_search1(self):
# s = Search() # 实例化一个类
assert True == self.s.search_func() # 类调用函数方法
print("测试完成")
if __name__ == '__main__':
unittest.main()
测试断言
1.assertEqual(self, first, second, msg=None)
--判断两个参数相等:first == second
2.assertNotEqual(self, first, second, msg=None)
--判断两个参数不相等:first != second
3.assertIn(self, member, container, msg=None)
--判断是字符串是否包含:member in container
4.assertNotIn(self, member, container, msg=None)
--判断是字符串是否不包含:member not in container
5.assertTrue(self, expr, msg=None)
--判断是否为真:expr is True
6.assertFalse(self, expr, msg=None)
--判断是否为假:expr is False
7.assertIsNone(self, obj, msg=None)
--判断是否为None:obj is None
8.assertIsNotNone(self, obj, msg=None) --判断是否不为None:obj is not None
9.assertIs(arg1,arg2,msg=None)
--判断是否是同一个对象
10.assertIsNot(arg1,arg2,msg=None)
--判断是否不是同一个对象
11.assertIsInstance(obj,cls,msg=None)
--判断obj是否是cls的实例对象
12.assertIsNotInstance(obj,cls,msg=None)
--判断obj是否不是cls的实例对象
执行方法
方法一:
if __name__ == '__main__':
unittest.main()
方法二:
import unittest
class Search:
def search_func(self):
print("search")
return True
class TestSearch(unittest.TestCase):
@classmethod
def setUpClass(cls) -> None:
cls.s = Search() # 在整个类的测试执行前 实例化被测类
def test_search1(self):
# s = Search() # 实例化一个类
assert True == self.s.search_func() # 类调用函数方法
print("测试完成1")
def test_search2(self):
# s = Search() # 实例化一个类
assert True == self.s.search_func() # 类调用函数方法
print("测试完成2")
if __name__ == '__main__':
# unittest.main()
suite = unittest.TestSuite()
suite.addTest(TestSearch.test_search1())
suite.addTest(TestSearch.test_search2())
unittest.TextTestRunner.run()
方法三:
import unittest
class Search:
def search_func(self):
print("search")
return True
class TestSearch1(unittest.TestCase):
@classmethod
def setUpClass(cls) -> None:
cls.s = Search() # 在整个类的测试执行前 实例化被测类
def test_search1(self):
# s = Search() # 实例化一个类
assert True == self.s.search_func() # 类调用函数方法
print("测试完成1")
def test_search2(self):
# s = Search() # 实例化一个类
assert True == self.s.search_func() # 类调用函数方法
print("测试完成2")
class TestSearch2(unittest.TestCase):
@classmethod
def setUpClass(cls) -> None:
cls.s = Search() # 在整个类的测试执行前 实例化被测类
def test_search1(self):
# s = Search() # 实例化一个类
assert True == self.s.search_func() # 类调用函数方法
print("测试完成3")
def test_search2(self):
# s = Search() # 实例化一个类
assert True == self.s.search_func() # 类调用函数方法
print("测试完成4")
if __name__ == '__main__':
# 将测试类加载成一个元素,需要测试多少个类就加载成多少元素
suite1 = unittest.TestLoader().loadTestsFromTestCase(TestSearch1)
suite2 = unittest.TestLoader().loadTestsFromTestCase(TestSearch2)
# 将元素加入到测试套件的列表中
s = unittest.TestSuite([suite1, suite2])
unittest.TextTestRunner(verbosity=2).run(s)
方法四:匹配某个文件夹下所有以test开头的py文件,执行文件内的所有测试用例
test_dir? 是装了所有测试文件的文件夹
import unittest
if __name__ == '__main__':
test_dir = r"./test_directory"
# suite=unittest.TestSuite()
discover = unittest.defaultTestLoader.discover(test_dir, pattern="test_*.py")
unittest.TextTestRunner(verbosity=2).run(discover)
生成测试报告
使用httptestrunner
HTMLTestRunner_PY3测试报告
import unittest
from until.HTMLTestRunner_PY3 import HTMLTestRunner
if __name__ == '__main__':
report_title = '测试报告标题'
desc = '测试描述'
report_file = r'./res.html'
test_dir = r"./test_directory"
# suite=unittest.TestSuite()
discover = unittest.defaultTestLoader.discover(test_dir, pattern="test_*.py")
# unittest.TextTestRunner(verbosity=2).run(discover)
with open(report_file, 'wb') as report:
runner = HTMLTestRunner(stream=report, title=report_title, description=desc)
runner.run(discover)
|