软件工程(2019)第二次作业

(一)选择开发工具


 由于将来想使用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来组装多个测试用例)

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. 测试结果

 Ctrl+Shift+F10,运行runtest.py

扫描二维码关注公众号,回复: 5857424 查看本文章

 结果表明,通过了两个测试,跳过了一个测试。将TestStringMethods()中的某个测试样例做出如下修改:

    @logit()
    def test_isupper(self):
        self.assertTrue('FOO'.isupper())
        self.assertFalse('Foo'.isupper())
        self.assertTrue('FOo'.isupper(), msg="非全大写")

 详细错误如图所示:

 结果表明,某个样例未通过。
 我们再来看看日志文件中的内容:

4. 生成测试报告

参考资料

猜你喜欢

转载自www.cnblogs.com/jiamingZ/p/10693360.html