(一)选择开发工具
由于将来想使用Python作为开发语言,并且本机已经安装了Python3.5环境以及IDE,所以这里选择Pycharm作为开发工具。软件截图如下:
(二)PyUnit测试框架
既然选择了Python作为开发语言,那么理所当然的就会考虑到使用PyUnit作为自动测试工具。
以下介绍属于测试框架的基本原理和概念部分。
python的单元测试框架 PyUnit,可以认为是 Java 语言下的单元测试框架 JUnit 的 Python 语言实现版本。
unittest要达到如下目标:
- 支持自动化测试
- 让所有的测试脚本共享 开启(setup) 和 关闭(shutdown) 的代码
- 可以通过集合(collections)的方式来组织测试用例脚本
- 将所有的测试脚本从测试报告框架中独立出来
为了达到以上目标,unittest支持如下几个重要概念:
- 测试装置(test fixture)
为一个或者多个测试用例做一些准备工作,例如:连接一个数据库,创建一个目录,或者开启一个进程 - 测试用例(test case)
测试用例是测试行为的最小单元,通过对一些输入输出值的对比来进行测试检查 - 测试套件(test suite)
将测试用例 或者 测试用例集合 聚合组织起来的集合。可以批量执行一个测试套件内所有的测 试用例 - 测试执行器(test runner)
组织安排测试脚本执行活动的组件。测试执行器通过一些图形界面,文本界面或者返回一些特殊的值来展示测试脚本的测试结果。主要用于生成测试报告
1. 项目目录结构
- TestDemo (工程名)
- report
- report.log(用于保存测试用例调用的日志文件)
- test_case(放置一些测试用例)
- test_String.py(关于字符串测试的样例)
- runtest.py(通过测试套件TestSuite来组装多个测试用例)
- report
2. 基本实例
字符串判断样例(test_String.py):
import time
import unittest
from functools import wraps
def logit(logfile='E:/Programmer/PYTHON/TestDemo/report/report.log', doc=''):
def logging_decorate(func):
@wraps(func)
def wrapped_function(*args, **kwargs):
log_string = time.strftime('%Y_%m_%d_%H_%M_%S ',time.localtime(
time.time())) + func.__name__ + ' was called.\n' + doc + '\n'
# 打开logfile,并写入内容
with open(logfile, 'a') as opened_file:
opened_file.write(log_string)
return func(*args, **kwargs)
return wrapped_function
return logging_decorate
class TestStringMethods(unittest.TestCase):
def setUp(self):
print('init by setUp...')
def tearDown(self):
print('end by tearDown...')
@logit()
def test_upper(self):
self.assertEqual('foo'.upper(), 'FOO')
@logit()
def test_isupper(self):
self.assertTrue('FOO'.isupper())
self.assertFalse('Foo'.isupper())
self.assertTrue('FOO'.isupper(), msg="非全大写")
@unittest.skip('暂时跳过用例test_split的测试')
def test_split(self):
s = 'hello world'
self.assertEqual(s.split(), ['hello', 'world'])
with self.assertRaises(TypeError):
s.split(2)
if __name__ == '__main__':
unittest.main()‘
构造测试集(runtest.py):
import unittest
from TestDemo.test_case import test_String
suite = unittest.TestSuite()
suite.addTest(test_String.TestStringMethods("test_isupper"))
suite.addTest(test_String.TestStringMethods("test_upper"))
suite.addTest(test_String.TestStringMethods("test_split"))
if __name__ == "__main__":
runner = unittest.TextTestRunner()
runner.run(suite)
3. 测试结果
结果表明,通过了两个测试,跳过了一个测试。将TestStringMethods()中的某个测试样例做出如下修改:
@logit()
def test_isupper(self):
self.assertTrue('FOO'.isupper())
self.assertFalse('Foo'.isupper())
self.assertTrue('FOo'.isupper(), msg="非全大写")
结果表明,某个样例未通过。
我们再来看看日志文件中的内容:
4. 生成测试报告
参考资料
- python自动化测试(3)
- unittest单元测试框架总结