测试代码
一.测试函数
测试函数如下:
name_function.py
def get_complete_name(first,last):
""" 形成完整的姓名 """
full_name=first+' '+last
return full_name.title()
names.py.
from name_function import get_complete_name
print("输入'quit'退出输入")
while True:
first=input("请输入姓:")
if first=='quit':
break
last=input('请输入名:')
if last=='quit':
break
full_name=get_complete_name(first,last)
print("您的姓名是:"+full_name)
1.单元测试和测试用例
Python标准库中的模块unittest提供了代码测试工具。单元测试用于测试函数的某个方面是否存在问题。测试用例是一组单元测试,这些测试一起核实函数在各种情形下的行为都是符合要求的。
test_name_function.py
import unittest
from name_function import get_complete_name
class NamesTestCase(unittest.TestCase):
"""测试name_function.py"""
def test_first_last_name(self):
"""测试函数get_complete_name()能否形成完整姓名"""
full_name=get_complete_name('yao','ming')
self.assertEqual(full_name,'Yao Ming')
unittest.main()
(1)先导入unittest模块和被测试的函数。
(2)再创建一个继承自unittest.TestCase的类。类名命名可随意,但最好与被测试函数相关且包含字样Test。
(3)在类中编写一系列方法对函数的不同方面进行测试。测试方法命名以test_开头,这个命名约定告诉测试运行者类的哪些方法表示测试。之后在运行当前.py文件时,这些以test_开头的方法都会自动运行。
(4)assertEuqual()是unittest中的一个断言方法,用于核实所得结果是否与预期的结果一致。
(5)unittest.main() 提供了一个测试脚本的命令行接口,让Python运行这个文件中的测试。
2.通过的测试
测试结果为:
.
----------------------------------------------------------------------
Ran 1 test in 0.003s
OK
(1)第一行一个句点表示有一个测试通过。
(2)第二行指出Python运行了一个测试,耗时不到0.001s。
(3)最后的OK表示测试用例中的所有测试都通过了。
3.未通过的测试
用E表示一个未通过的测试,最后FAILED指出运行测试用例时发生了几个错误。
二.测试类
survey_test.py
class Survey():
"""调查问卷"""
def __init__(self,question):
"""存储一个调查问题,并为调查结果的存储做准备"""
self.question=question
self.answer=[]
def show_question(self):
"""显示调查的问题"""
print(self.question)
def store_answer(self,response):
self.answer.append(response)
def show_answer(self):
print("调查结果如下")
for dana in self.answer:
print('-'+dana)
test.py
import unittest
from survey_test import Survey
class SurveyTestCase(unittest.TestCase):
"""测试survey_test.py"""
def setUp(self):
"""创建调查问题和调查答案,以供测试使用"""
question='请告诉我你学过的课程:'
self.my_question=Survey(question)
self.answer=['chinese','math','science','biology']
def test_store_single(self):
"""检查单个调查结果是否被妥善存储"""
self.my_question.store_answer(self.answer[0])
self.assertIn(self.answer[0],self.my_question.answer)
def test_store_each(self):
"""检查每个调查结果是否被妥善存储"""
for response in self.answer:
self.my_question.store_answer(response)
for response in self.my_question.answer:
self.assertIn(response,self.my_question.answer)
unittest.main()
测试结果:
..
----------------------------------------------------------------------
Ran 2 tests in 0.006s
OK
1.各种断言方法
方法 | 用途 |
---|---|
assertEqual(a,b) | 核实a==b |
assertNotEqual(a,b) | 核实a!=b |
assertTrue(x) | 核实x为True |
assertFalse(x) | 核实x为False |
assertIn(item,list) | 核实item在list中 |
assertNotIn(item,list) | 核实item不在list中 |
2.方法setUp()
在对类进行测试时,需要在每个测试方法中创建一个实例,这样做往往效率不高。因而,可以使用unittest.TestCase类中的方法setUp(),只需要创建实例一次,并在每个测试方法中用到这些实例。如果在unittest.TestCase的子类中包含了方法setUp(),Python将先运行它,再去运行以test_开头的各个测试方法。(具体见上述测试例)
3.小结
运行测试用例时,每完成一个单元测试,Python都打印一个字符:(每个测试都会有一个字符返回)
- 测试通过时,打印一个句点;
- 测试引发错误时,打印一个E;
- 测试导致断言失败时,打印一个F。