测试和调试
测试
单元测试
- unit test;
- 针对函数/类/模块各方面,
- 进行正确性检验。
测试用例
- test case;
- 进行单元测试各实例的集合。
定义测试
测试函数
- import 语句;
- 测试类;
- 继承类:unittest.TestCase;
- 测试函数;
- assert 相关方法;
- if 语句。
import unittest
from test_function import function_name
class TestCase(unittest.TestCase):
"""Tests for 'test_function.py'."""
def test_case(self):
return_value = function(args)
self.assertEqual(test_value, return_value)
if __name__ == '__main__':
unittest.main()
测试类
- import 语句;
- 测试类;
- 继承类:unittest.TestCase;
- 测试函数;
- setUp() 函数;
- assert 相关方法;
- if 语句。
import unittest
from test_class import ClassName
class TestCase(unittest.TestCase):
def setUp(self):
"""
Create a survey and a set of responses for use in all test methods.
"""
self.instance = ClassName(args)
self.test_value = value
def test_case(self):
return_value = self.instance.function_name(args)
self.assertEqual(test_value, return_value)
if __name__ == '__main__':
unittest.main()
测试结果
- 通过:。;
- 出现错误:E;
- 断言失败:F。
# 成功
.
----------------------------------------------------------------------
Ran 1 test in 0.000s
OK
# 错误
E
======================================================================
ERROR: test_first_last_name (__main__.NamesTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
File "test_name_function.py", line 8, in test_first_last_name
formatted_name = get_formatted_name('janis', 'joplin')
TypeError: get_formatted_name() missing 1 required positional argument: 'last'
----------------------------------------------------------------------
Ran 1 test in 0.000s
FAILED (errors=1)
# 失败
.F
======================================================================
FAIL: test_city_country_population (__main__.NamesTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
File "d:\kxh\code\python\python_crash_course\chapter_10\test_cities.py", line 12, in test_city_country_population
self.assertFalse(formatted_name, 'Santiago, Chile - Population 50000')
AssertionError: 'Santiago, Chile - Population 50000' is not false : Santiago, Chile - Population 50000
----------------------------------------------------------------------
Ran 2 tests in 0.000s
FAILED (failures=1)
setUp() 方法
机制
- 一个类中最先被调用的函数,
- 每次执行一个函数都要先执行这个函数。
if __name__ == '__main__':
- 魔法方法;
- 保证导入某模块时,不执行该模块。
机制
- 每个 python 模块包含内置变量 __name__,表示该模块
- 当直接执行该模块时,其值为 "__main__",
- 当导入到其他模块时,其值为模块文件名(无后缀 .py),
- 故通过使用上述 if 语句,当导入该模块时,不执行对应语句。
# 不使用 if __name__ == '__main__':
# 模块 A
a = 10
print('我是模块A……')
print(a)
# 模块 B
from module import A
b = 20
print('__name__')
print(b)
# 运行模块 A
__main__
10
# 运行模块 B
a
10
__main__
20
# 使用 if __name__ == '__main__':
# 模块 A
a = 10
print('__name__')
if __name__ == '__main__':
print(a)
# 模块 B
from module import A
b = 20
print('__name__')
print(b)
# 运行模块 B
a
__main__
20
常用断言方法
assertEqual() 方法
- assertEqual(first,second,msg=None)。
- 判断 first 和 second 是否相等,相等测试成功,反之失败;
- first/second:比较值;
- msg:失败时显示信息;
assertNotEqual() 方法
- assertNotEqual(first,second,msg=None)。
- 判断 first 和 second 是否不相等,不相等测试成功,反之失败;;
- first/second:比较值;
- msg:失败时显示信息;
assertTrue() 方法
- assertTrue(expr,msg=None)
- 判断 exper 是否为真,为真测试成功,反之失败;
- exper:判断对象;
- msg:失败时显示信息;
assertFalse() 方法
- assertFalse(expr,msg=None)
- 判断 exper 是否为假,为假测试成功,反之失败;
- exper:判断对象;
- msg:失败时显示信息;
assertIn() 方法
- assertIn(member,container,msg=None)。
- 判断 member 是否在 container 中,在 container 中测试成功,反之失败;
- member:判断对象;
- container:包含若干结果的列表。
- msg:失败时显示信息;
assertNotIn() 方法
- assertNotIn(member,container,msg=None)。
- 判断 member 是否在 container 中,不在 container 中测试成功,反之失败;
- member:判断对象;
- container:包含若干结果的列表;
- msg:失败时显示信息;