Python 测试

作者: 赵者也 | 来源:发表于2018-01-27 18:10 被阅读25次

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.title()

names.py 的代码:

from LearnPythonRecord.name_function import get_formatted_name

print("Enter 'q' at any time to quit.")

while True:
    first = input("\nPlease give me a first name: ")
    if first == 'q':
        break
    last = input("Please give me a last name: ")
    if last == 'q':
        break

    formatted_name = get_formatted_name(first, last)
    print("\tNeatly formatted name: " + formatted_name + '.')

  1. 可通过的测试

test_name_function.py 的代码如下

# *- coding: utf-8 -*
# Created by: ZhaoDongshuang
# Created on: 2018/1/27

import unittest

from name_function import get_formatted_name


class NameTestCase(unittest.TestCase):

    def test_first_last_name(self):
        self.assertEqual(get_formatted_name('janis', 'joplin'),
                         'Janis Joplin')


if __name__ == '__main__':
    unittest.main()

输出结果:

可通过的测试输出结果
  1. 测试类

survey.py 类:

# *- coding: utf-8 -*
# Created by: ZhaoDongshuang
# Created on: 2018/1/27


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)

类的使用 language_survey.py 方法:

# *- coding: utf-8 -*
# Created by: ZhaoDongshuang
# Created on: 2018/1/27

from survey import AnonymousSurvey

question = "What language did you first learn to speak?"
my_survey = AnonymousSurvey(question)

my_survey.show_question()
print("Enter 'q' at any time to quit.\n")
while True:
    response = input("Language: ")
    if response == 'q':
        break
    my_survey.store_response(response)

print("\nThank you to everyone who participated in the survey!")
my_survey.show_results()

测试类 test_survey.py :

# *- coding: utf-8 -*
# Created by: ZhaoDongshuang
# Created on: 2018/1/27

import unittest

from survey import AnonymousSurvey


class TestAnonymousSurvey(unittest.TestCase):
    def test_store_single_response(self):
        question = "What language did you first learn to speak?"
        my_survey = AnonymousSurvey(question)
        my_survey.store_response('English')
        self.assertIn('English', 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)


if __name__ == '__main__':
    unittest.main()

测试输出:

类的测试输出
  1. 方法 setUp()

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

# *- coding: utf-8 -*
# Created by: ZhaoDongshuang
# Created on: 2018/1/27

import unittest

from survey import AnonymousSurvey


class TestAnonymousSurvey(unittest.TestCase):
    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)


if __name__ == '__main__':
    unittest.main()

本文参考自 《Python 编程:从入门到实践

相关文章

网友评论

    本文标题:Python 测试

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