用人话概况Python基础(八):测试代码
背景介绍
由于测试代码是参与工作量较大的项目时,是非常重要的行为,但作为初学者来说,并非必须为每一个项目代码编写测试,所以本文就简单的介绍
在项目中包含初步测试的代码,很容易得到别人的赞扬,因为别人可以更加方便的测试你的项目,因此在今后对重要的代码块编写测试是一种不错的良好习惯
由于是测试代码,所以就得有测试案例,假设有个测试案例如下:
- 首先在当前目录下创建一个名为name_fun.py的文件
#coding=gbk
def get_test_name(first, last):
"""测试名字的代码"""
full_name = first + ' ' + last
return full_name.title()
- 再同级目录中再创建names.py执行文件
#coding=gbk
from name_fun import get_test_name
while True:
first = raw_input("请输入您的姓:")
if first == 'q':
break
last = raw_input('请输入您的名:')
if last == 'q':
break
full_name = get_test_name(first, last)
print(full_name)
单元测试和测试用例:
- Python标准库中的模块unittest 提供了代码测试工具;
- 单元测试用于核实函数的某个方面没有问题
- 测试用例是用来核实函数在各种情形下的行为是否符合要求
- 断言(Assertion)是一种调试程序的方式。
通过测试
- 用于测试name_fun.py代码的文件
文件名:test_name_fun.py
#coding=gbk
import unittest
from name_fun import get_test_name
class NamesTestCase(unittest.TestCase):
"""测试name_fun.py"""
def test_first_last_name(self):
"""能够正确的处理姓名"""
full_name = get_test_name('lin', 'xiao')
self.assertEqual(full_name, 'Lin Xiao')
unittest.main()
#编译结果
.
----------------------------------------------------------------------
Ran 1 test in 0.001s
OK
------------------
(program exited with code: 0)
请按任意键继续. . .
案例分析:
①我们首先导入模块unittest 以及要测试的函数,再创建一个继承unittest.TestCase 的类
②我们创建了一个名为NamesTestCase 的类(名字要有意义),这个类必须继承unittest.TestCase 类,这样Python才会知道如何运行你编写的代码
③方法assertEqual()是unittest类中最有用的功能之一,,是一种断言方法。断言方法是用来核实得到的结果是否与期望的结果一样
④assertEqual(a,b)有两个实参,是用来核实是否满足“a == b”这个条件的
⑤unittest.main()调用这句话, unittest.main()会提供了一个测试脚本的命令行接口,将会生成特定输出格式。
⑥在输出格式中,我们可以看到ok,表示代码测试成功。
⑦在第一行有一个点,代表着有一个测试案例成功,并且在【Ran 1 test in 0.001s】也告诉了我们有1个test案例
测试不通过
我们来看下测试不通过的情况
#coding=gbk
import unittest
from name_fun import get_test_name
class NamesTestCase(unittest.TestCase):
"""测试name_fun.py"""
def test_first_last_name(self):
"""能够正确的处理姓名"""
#在此处故意传入的是xidao,另assertEqual(a,b)方法中的a != b
full_name = get_test_name('lin', 'xidao')
self.assertEqual(full_name, 'Lin Xiao')
unittest.main()
#编译执行结果
F
======================================================================
FAIL: test_first_last_name (__main__.NamesTestCase)
能够正确的处理姓名
----------------------------------------------------------------------
Traceback (most recent call last):
File "test_name_fun.py", line 13, in test_first_last_name
self.assertEqual(full_name, 'Lin Xiao')
AssertionError: 'Lin Xidao' != 'Lin Xiao'
- Lin Xidao
? -
+ Lin Xiao
----------------------------------------------------------------------
Ran 1 test in 0.025s
FAILED (failures=1)
------------------
(program exited with code: 1)
请按任意键继续. . .
案例分析:
①通过案例分析查看,我们很容易可以看出通过断言方法测试代码是挺有效的,尤其在代码大的项目中使用,而在小项目中可以具情况而决定是否使用
②当测试代码不通过时,我们可以发现它将会很详细的显示出错误原因是什么,并向你指出。
更多的常用断言方法
Method | Checks that |
assertEqual(a, b) | a == b |
assertNotEqual(a, b) | a != b |
assertTrue(x) | bool(x) is True |
assertFalse(x) | bool(x) is False |
assertIn(a , b ) | a in b |
assertNotIn(a , b ) | a not in b |