摘要
单元测试是用来对一个模块、一个函数或者一个类来进行正确性检验的测试工作。在软件开中的测试是很重要的一部分。
python测试相关库
- unittest,内置库,模仿PyUnit写的,简洁易用,缺点是比较繁琐。
- nose,测试发现,发现并运行测试。
- pytest,笔者目前喜欢用这个,写起来很方便,并且很多知名开源项目在用,推荐。
- mock, 替换掉网络调用或者 rpc 请求等
python unittest测试实践
import unittest
class TestStringMethods(unittest.TestCase):
def test_upper(self):
function_vale='foo'.upper()#表示的调用的API的返回的结果
test_value='FOO'#测试用例的数据指:有可能是自己构造的,有可能是从别的地方抓取的结果
self.assertEqual(function_vale, test_value)#表示的
def test_isupper(self):
function_vale1='FOO'
function_vale2 = 'foo'
self.assertTrue(function_vale1.isupper())
self.assertFalse(function_vale2.isupper())
def test_split(self):
function_value= 'hello world'
test_value=['hello', 'world']
self.assertEqual(function_value.split(), test_value)
# check that s.split fails when the separator is not a string
with self.assertRaises(TypeError):
function_value.split(2)
if __name__ == '__main__':
unittest.main()
继承?unittest.TestCase ?就创建了一个测试样例。上述三个独立的测试是三个类的方法,这些方法的命名都以?test ?开头。 这个命名约定告诉测试运行者类的哪些方法表示测试。
每个测试的关键是:调用?assertEqual() ?来检查预期的输出; 调用?assertTrue() ?或?assertFalse() ?来验证一个条件;调用?assertRaises() ?来验证抛出了一个特定的异常。使用这些方法而不是?assert ?语句是为了让测试运行者能聚合所有的测试结果并产生结果报告。
通过?setUp() ?和?tearDown() ?方法,可以设置测试开始前与完成后需要执行的指令。 在?组织你的测试代码?中,对此有更为详细的描述。
...
----------------------------------------------------------------------
Ran 3 tests in 0.000s
OK
在调用测试脚本时添加?-v ?参数使?unittest.main() ?显示更为详细的信息,生成如以下形式的输出:
test_isupper (__main__.TestStringMethods) ... ok
test_split (__main__.TestStringMethods) ... ok
test_upper (__main__.TestStringMethods) ... ok
----------------------------------------------------------------------
Ran 3 tests in 0.001s
OK
setUp与tearDown
可以在单元测试中编写两个特殊的setUp()和tearDown()方法。这两个方法会分别在每调用一个测试方法的前后分别被执行。
setUp()和tearDown()方法有什么用呢?设想你的测试需要启动一个数据库,这时,就可以在setUp()方法中连接数据库,在tearDown()方法中关闭数据库,这样,不必在每个测试方法中重复相同的代码:
class TestDict(unittest.TestCase):
def setUp(self):
print('setUp...')
def tearDown(self):
print('tearDown...')
使用Pytest库进行测试?
import pytest
def add(a, b):
assert all([isinstance(a, int), isinstance(b, int)])
return a + b
def test_add():
assert add(1, 2) == 3
assert isinstance(add(1, 2) , int)
with pytest.raises(Exception): # test exception
add('1', 2)
在运行test的时候如果是预见到这个错误的测试案例,那么久不会接下来运行新的测试案例了。
参考文章
https://docs.python.org/zh-cn/3/library/unittest.html
https://zhuanlan.zhihu.com/p/29968920
|