zoukankan      html  css  js  c++  java
  • 软件工程(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.
    ' + doc + '
    '
    
    			# 打开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

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

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

     详细错误如图所示:

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

    4. 生成测试报告

    参考资料##

  • 相关阅读:
    shell字符串截取
    QT,QT SDK, QT Creator 区别
    linux -- 扩容 /home 空间( xfs文件系统分区扩容指定挂载点)
    条件变量与互斥量
    越努力越幸运--2018年7月22日周记
    越努力越幸运--动态数组vector
    越努力越幸运--3-日常bug修复
    越努力越幸运--2-LD_PRELOAD, fork ,僵尸进程
    越努力越幸运--1
    makefile--回顾基础篇
  • 原文地址:https://www.cnblogs.com/jiamingZ/p/10693360.html
Copyright © 2011-2022 走看看