Python学习笔记11-测试代码

测试代码

1.单元测试和测试用例
Python标准库中的模块unittest提供了代码测试工具。单元测试用于核实函数的某个方面没有问题;测试用例是一组单元测试,这些单元测试一起核实函数在各个情况下的行为都符合要求。良好的测试用例考虑了函数可能受到的各种输入,包含针对所有这些情形的测试。

2.测试函数
直接看一个例子,下面是一个简单的函数,它接受包含中间名的外国姓名并返回整洁的姓名:

def get_formatted_name(first,last,middle=''):
    """生成整洁的姓名"""
    if middle:
        full_name = first +' '+ middle +' '+last
    else:
        full_name = first +' '+last
    return full_name.title()

看这个函数我们可以很清楚地知道,它返回值有两种情况,一是返回由三个部分组成的姓名;二是返回由两个部分组成的姓名。所有我们可以设置两个测试单元作为一组测试用例。

测试的代码:

import unittest
from name_function import get_formatted_name

class NamesTestCase(unittest.TestCase):
    """测试name_function.py"""

    def test_first_last_name(self):
        """能够正确地处理像Janis Joplin这样的姓名"""
        formatted_name = get_formatted_name('janis','joplin')
        self.assertEqual(formatted_name,'Janis Joplin')

    def test_first_last_middle_name(self):
        """能够正确地处理像Wolfgang Amadeus Mozart这样的姓名吗?"""
        formatted_name = get_formatted_name(
            'wolfgang','mozart','amadeus')
        self.assertEqual(formatted_name,'Wolfgang Amadeus Mozart')

unittest.main()

结果
例子
出现上图的结果,说明你的测试通过了;否则,测试未通过,然后它会告诉你哪些地方存在问题。
**注意:**测试类中的方法要以test开头。

3.测试类
上面我们学会了怎么做针对单个函数的测试,下面来编写针对类的测试。
(1)判断方法
Python在unittest.TestCase类中提供了很多判断方法。

assertEqual(a,b)           判断是否 a == b
assertNotEqual(a,b)        判断是否 a != b
assertTrue(x)              判断x是否为true
assertFalse(x)             判断x是否为false
asserIn(item, list)        判断item是否在list中
assertNotIn(item, list)    判断item是否不在list中

(2)例子:一个帮助管理匿名调查的类
代码:

class AnonymousSurvey():
    """收集匿名调查问卷的答案"""

    def __init__(self,question):
        """储存一个问题,并为储存答案做准备"""
        self.question = question
        self.responses = []

    def show_question(self):
        """显示调查问卷"""
        print(self.question)

    def store_response(self,new_response):
        """储存单份调查问卷"""
        self.responses.append(new_response)
    def show_results(self):
        """显示收集到的所有答案"""
        print("Survey results:")
        for response in self.responses:
                  print('- ' + response)

测试:

import unittest
from survey import AnonymousSurvey

class TestAnonymousSurvey(unittest.TestCase):
    """针对AnonymousSurvey类的测试"""

    def test_store_single_response(self):
        """测试单个答案会被妥善地储存"""
        question = "What language did you first learn to speak?"""
        my_survey = AnonymousSurvey(question)
        my_survey.store_response('Chinese')

        self.assertIn('Chinese',my_survey.responses)

    def test_store_three_responses(self):
        """测试三个答案会被妥善地储存"""
        question = "What language did you first learn to speak?"
        my_survey = AnonymousSurvey(question)
        responses = ['English','Spanish','Mandarin']
        for response in responses:
            my_survey.store_response(response)

        for response in responses:
            self.assertIn(response,my_survey.responses)

unittest.main()

结果
例子
4.函数setUp()
在前面的例子中,我们在每个测试方法中都创建了一个AnonymousSurvey实例,并在每个方法中都创建了答案。unittest.TestCase类包含方法setUp(),让我们只需创建这些对象一次,并且在每个测试方法中使用它们。如果你在TestCase类中包含了方法setUp(),Python将先运行它,再运行各个以test_打头的方法。
如下,刚刚的测试方法可以这样写。

import unittest
from survey import AnonymousSurvey

class TestAnonymousSurvey(unittest.TestCase):
    """针对AnonymousSurvey类的测试"""

    def setUp(self):
        """创建一个调查对象和一组答案,供下面的方法使用"""
        question = "What language did you first learn to speak?"
        self.my_survey = AnonymousSurvey(question)
        self.responses = ['English','Spanish','Mandarin']

    def test_store_single_response(self):
        """测试单个答案会被妥善地储存"""
        self.my_survey.store_response(self.responses[0])

        self.assertIn(self.responses[0],self.my_survey.responses)

    def test_store_three_responses(self):
        """测试三个答案会被妥善地储存"""
        for response in self.responses:
            self.my_survey.store_response(response)

        for response in self.responses:
            self.assertIn(response,self.my_survey.responses)

unittest.main()

结果与原来的相同。
(参考资料《Python编程从入门到实践》)

发布了45 篇原创文章 · 获赞 52 · 访问量 2823

猜你喜欢

转载自blog.csdn.net/weixin_43520670/article/details/98182996