美文网首页
Python学习笔记9—测试代码

Python学习笔记9—测试代码

作者: 肉松饼饼 | 来源:发表于2017-12-22 14:19 被阅读0次

Python标准库中的模块unittest提供了测试代码工具。单位测试用于核实函数的某个方面没有问题;测试用例是一组单元测试,这些单元测试一起核实函数在各种情形下的行为都符合要求。良好的测试用例考虑到了函数可能收到的各种输入,包含针对所有这些情形的测试。全覆盖式测试用例包含一整套单元测试,涵盖了各种可能的函数使用方法。对于大型项目,要实现全覆盖式可能很难。通常,最初要求针对代码的重要行为编写测试即可,等项目被广泛使用时再考虑全覆盖。

一、单元测试

1、测试函数

name_function.py

def get_formatted_name(first,last):
    """Generate a neatly formatted full name."""
    full_name = first + ' ' + last
    return full_name.tiltle()

test_name_function.py

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')

unittest.main()

注:

  • 首先导入uinttest模块和要测试的函数
  • 创建测试类NamesTestCase,这个可随便给这个类命名,但最好让它看起来与要测试的函数相关,并包含字样Test。这个类必须继承unittest.TestCase类,这样Python才知道如何运行你编写的测试。
  • 运行test_name_function.py时,所有以test_打头的方法都将自动运行。
  • 断言方法

2、测试未通过时要怎么办

测试未通过,不要修改测试,应修复导致测试不能通过的代码:检查刚对函数所做的修改,找出导致函数行为不符合预期的修改。

二、测试类

1、各种断言方法

方法 用途
assertEqaul(a,b) 核实 a == b
assertNotEqaul(a,b) 核实 a != b
assertTrue(x) 核实 x 为True
assertFalse(x) 核实 x 为False
assertIn(item,list) 核实 item在list中
assertNotIn(item,list) 核实 item不在list中

2、一个要测试的类

类的测试与函数的测试相似,你所做的大部分工作都是测试类中的方法,但存在一些不同之处。
survey.py

class AnonymousSurvey():
    """收集匿名调查文件的答案"""
    def __init__(self,question):
        """存储一个问题,并未存储答案做准备"""
        self.question = question
        self.responses = []

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

    def store_response(self,new_response):
        """存储单位调查问卷"""
        self.responses.append(new_response)

   def show_results(self):
        """显示收集到的所有答案"""
        print("Survey Result: ")
        for response in responses:
            print(' - ' + response)

3、测试类

test_survey.py

import unittest
from survey import AnnoymousSurvey

class TestAnnoymouseSurvey(unittest.TestCase):
    """创建AnnoymousSurvey类的测试"""
    
    def test_store_single_response(self):
        """测试单个答案会被妥善地存储"""
        question = "What langeuage did you first learn to speak?"
        my_survey = AnnoymousSurvey(question) 
        my_survey.store.response('English')

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

    def test_store_three_response(self):
        """测试单个答案会被妥善地存储"""
        question = "What langeuage did you first learn to speak?"
        my_survey = AnnoymousSurvey(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()

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

import unittest
from survey import AnnoymousSurvey

class TestAnnoymouseSurvey(unittest.TestCase):
    """创建AnnoymousSurvey类的测试"""

    def setUp(self):
        """创建一个调查对象和一组答案,供使用的测试方法使用"""
        question = "What langeuage did you first learn to speak?"
        my_survey = AnnoymousSurvey(question) 
        responses = ['English','Spanish','Mandarin']
        
    
    def test_store_single_response(self):
        """测试单个答案会被妥善地存储"""
        self.my_survey.store_responsse(self.responses[0])
        self.assertEqaul(self.responses[0],my_survey.store_responses)

    def test_store_three_response(self):
        """测试单个答案会被妥善地存储"""

        for response in self.responses:
            self.my_survey.store_response(response)

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

5、运行结果

运行测试用例时,每完成一个单元测试,Python都打印一个字符:测试通过时打印一个句点;测试引发错误时打印一个E;测试导致断言失败时打印一个F。

相关文章

网友评论

      本文标题:Python学习笔记9—测试代码

      本文链接:https://www.haomeiwen.com/subject/xdltgxtx.html