用人话概况Python基础(八):测试代码

背景介绍

由于测试代码是参与工作量较大的项目时,是非常重要的行为,但作为初学者来说,并非必须为每一个项目代码编写测试,所以本文就简单的介绍

在项目中包含初步测试的代码,很容易得到别人的赞扬,因为别人可以更加方便的测试你的项目,因此在今后对重要的代码块编写测试是一种不错的良好习惯

由于是测试代码,所以就得有测试案例,假设有个测试案例如下:

python做问卷调查数据分析 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