python从入门到实践读书笔记(七)
tag: python从零开始学习
种一棵树最好的时候,十年前或者今天!
第十一章 测试代码
非常重要,程序员的工作主要不是敲代码,而是设计和维护代码,而测试代码就非常重要了
学习使用python模块unittest中的工具来测试代码。
单元测试:用来核实函数的每个方面没有问题。
一般,普通的项目只对代码的重要行为编写测试,当项目被广泛使用时再考虑全覆盖测试。
测试用例需要导入unittest模块和需要测试的模块,
其类名最好与要测试的函数相关,并包含关键字Test,并且该类必须继承unittest.TestCase
类。
断言方法:用来核实得到的结果是否与期望的结果一致。
测试函数
运行结果与预期的一致
# 导入python标准库中的unittest模块
import unittest
from name_fuction import get_formatted_name
class NmaesTestCase(unittest.TestCase):
"""测试name_fuction.py"""
def test_frist_last_name(self):
"""能够正确地处理姓名吗?"""
formatted_name = get_formatted_name('jans', 'green')
self.assertEqual(formatted_name, 'Jans Green')
unittest.main()
测试错误
例如,在函数中增加一个参数。
测试报告;会反馈通过的和错误的数量。
def get_formatted_name(first, mid, last):
full_name = first + " " + mid + " " + last
return full_name
unittest断言
自动化的测试中, 对于每个单独的case来说,一个case的执行结果中, 必然会有期望结果与实际结果, 来判断该case是通过还是失败。
在unittest 的库中提供了大量的实用方法来检查预期值与实际值, 来验证case的结果。 一般来说, 检查条件大体分为等价性, 逻辑比较以及其他。
如果给定的断言通过, 测试会继续执行到下一行的代码, 如果断言失败, 对应的case测试会立即停止或者生成错误信息( 一般打印错误信息即可) ,但是不要影响其他的case执行。
unittest 的单元测试库提供了标准的xUnit 断言方法。下面是一些常用的断言
序号 | 断言方法 | 断言描述 |
---|---|---|
1 | assertEqual(a, b, msg=None) | 验证a=b |
2 | assertNotEqual(a, b, msg=None) | 验证a != b, 相等 |
3 | assertTrue(expr, msg=None) | 验证expr是true |
4 | assertFalse(expr,msg=None) | 验证expr是false |
5 | assertIs(a, b, msg=None) | 验证a、b是同一个对象 |
6 | assertIsNot(a, b, msg=None) | 验证a、b不是同一个对象 |
7 | assertIsNone(expr, msg=None) | 验证expr是None |
8 | assertIsNotNone(expr, msg=None) | 验证expr不是None |
9 | assertIn(a, b, msg=None) | 验证a是b的子串 |
10 | assertNotIn(a, b, msg=None) | 验证a不是b的子串 |
11 | assertIsInstance(obj, cls, msg=None) | 验证obj是cls的实例 |
12 | assertNotIsInstance(obj, cls, msg=None) | 验证obj不是cls的实例 |
测试类
使用setUp()方法,python将优先运行setUp()方法",再运行各个test开头的方法。
可以在setUp()方法中创建一系列实例并设置他们的顺序,再在测试方法中直接使用这些实例。
import unittest
from survey import answer
class TestAnswer(unittest.TestCase):
"""测试answer类"""
def setUp(self):
"""python将优先运行setUp()方法",再运行各个test开头的方法"""
question = "what language did you first learn to speak?"
self.my_survey = answer(question)
self.responses = ['English', 'spanish', 'free']
def test_store_three_response(self):
""""测试三个答案会被保存"""
# 保存
for response in self.responses:
self.my_survey.answer_append(response)
for response in self.responses:
self.assertIn(response, self.my_survey.responses)
注:运行测试用例时,每完成一个单元测试,python都打印一个字符。通过打印一个句点,错误打印一个E,测试导致断言失败时打印一个F