单元测试
白盒测试–开发进行测试,很少去做,迭代很快,不会做去代码层面的测试
单元测试的思想:
单元测试框架:unittest,pytest,nose,mock
输入输出的思想
uniitest 和 pytest
unittest 内置函数
单元测试的覆盖率:指标:代码覆盖率
单元测试覆盖类型:
语句覆盖,条件覆盖,判断覆盖,路径覆盖
语句覆盖:每行代码会被执行一遍
判断覆盖:每一个判断的测试 T or F
条件覆盖:每一个条件的测试 T or F ,测试用例的用例太多的
路径覆盖:覆盖所有可能的路径
unittest框架
:基于JUnit的思想,开发的框架
test fixture 测试的装饰,用例前用例后
test case
test suite 批量执行用例
test runner
编写规范:
测试模块首先import unittest
测试类必须继承 unittest.TestCase
测试方法必须以 test 开头
测试框架结构
setup用来为测试准备环境
teardown用来清理环境
类级别的方法,需要加上一个装饰器@classmethod
setupclass 所有case执行前准备一次环境,类之前执行
teardownclass 所有case执行结束后清理一次环境
@unittest.skip 方法不在本次执行
"""
@Time :2021/10/28 13:15
@Author :Wesley
@File :demo_a.PY
"""
"""
unittest框架
"""
import unittest
class TestStringMethods(unittest.TestCase):
# 每个case执行前调用
def setUp(self) -> None:
print('setup')
# 每个case执行结束调用
def tearDown(self) -> None:
print('teardown')
# 整个类执行前调用
@classmethod
def setUpClass(cls) -> None:
print('setupclass')
# 整个类执行结束调用
@classmethod
def tearDownClass(cls) -> None:
print('teardownclass')
def test_abc(self):
print('abc')
def test_upper(self):
self.assertEqual('foo'.upper(), 'FOO')
def test_isupper(self):
self.assertTrue('FOO'.isupper())
self.assertFalse('Foo'.isupper())
def test_split(self):
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_fun(self):
print('search')
return True
class TestSearch(unittest.TestCase):
# @classmethod
# def setUpClass(cls) -> None:
# print('setupclass')
# cls.search = Search()
#
# @classmethod
# def tearDownClass(cls) -> None:
# print('teardownclass')
def setUp(self) -> None:
print('setup')
self.search=Search()
def teardown(self) -> None:
print('teardown')
self.search=Search()
def test_search1(self):
print('testsearch1')
search = Search()
assert True == self.search.search_fun()
def test_search2(self):
print('testsearch2')
search = Search()
assert True == self.search.search_fun()
def test_search3(self):
print('testsearch3')
search = Search()
assert True == self.search.search_fun()
if __name__ == '__main__':
unittest.main()
unittest执行用例
# 执行方式一:unittest.main()
if __name__ == '__main__':
unittest.main()
# 执行方式二:unittest.testsuite
if __name__ == '__main__':
suite = unittest.TestSuite()
suite.addTest(TestSearch('test_search1'))
unittest.TextTestRunner().run(suite)
# 执行方式三:执行某个测试类
if __name__ == '__main__':
suite1 = unittest.TestLoader().loadTestsFromTestCase(TestSearch)
suite2 = unittest.TestLoader().loadTestsFromTestCase(TestSearch)
suite = unittest.TestSuite([suite1, suite2])
unittest.TextTestRunner(verbosity=2).run(suite)
# 执行方式四:搜索test执行
if __name__ == '__main__':
test_dir = '../testcases'
discover = unittest.defaultTestLoader.discover(test_dir, pattern='test*.py')
unittest.TextTestRunner(verbosity=2).run(discover)
'''
unittest执行用例过程
1,首先写好TestCase
2,然后由TestLoader加载TestCase到TestSuite
3,由TextTestRunner运行TestSuite
4,执行的结果保存在TextTestResult中
5,整个过程集成在unittest.main模块中
'''