• 0
  • 0
分享
  • python unittest自动化测试框架总结——软件测试圈
  • TIMI 2022-06-15 10:58:50 字数 3636 阅读 2056 收藏 0

一、unittest工作原理

unittest最核心的四部分是:TestCase,TestSuite,TestRunner,TestFixture

TestCase:用户自定义的测试case的基类,调用run()方法,会依次调用setUp方法、执行用例的方法、tearDown方法。

TestSuite:测试用例集合,可以通过addTest()方法手动增加Test Case,也可以通过TestLoader自动添加Test Case,TestLoader在添加用例时,会没有顺序。

TestRunner:运行测试用例的驱动类,可以执行TestCase,也可以执行TestSuite,执行后TestCase和TestSuite会自动管理TESTResult。

TestFixture:简单来说就是做一些测试过程中需要准备的东西,比如创建临时的数据库,文件和目录等,其中setUp()和setDown()是最常用的方法

整个的流程就是首先要写好TestCase,然后由TestLoader加载TestCase到TestSuite,然后由TestTestRunner来运行TestSuite,运行的结果保存在TextTestReusult中,整个过程集成在unittest.main模块中。

二、例子如下:

创建一个函数集mathfunc.pyc

def add(a,b):
    return a+b
 
def minus(a, b):
    return a-b
 
def multi(a, b):
    return a*b
 
def divide(a, b):
    return a/b

接下来是为这些方法写的一个测试:

test_mathfunc.py

# -*- coding: utf-8 -*-
 
import unittest
from mathfunc import *
 
class TestMathFunc(unittest.TestCase):
 
    def setUp(self):
        print "do something befor test.prepare environment"
 
    def tearDown(self):
        print "do something after test.Clean up"
 
    def test_add(self):
        self.assertEqual(3,add(1,2))
        self.assertNotEqual(3,add(2,2))
 
    @unittest.skip("i don't want to run this case")
    def test_minus(self):
        self.assertEqual(1,minus(3,2))
 
    def test_multi(self):
        self.assertEqual(6,multi(2,3))
 
    def test_divide(self):
        self.assertEqual(2,divide(6,3))
        self.assertEqual(2.5,divide(5,2))
 
if __name__ == '__main__':
    unittest.main()

执行结果如下:

1.png

组织TestSuite

上面的代码演示了如何编写一个简单的测试,下面说一下怎么控制用例执行的顺序。我们就要用到TestCase,添加到TestCaseDE中的case是会按照添加的顺序执行的。

来个例子:

在文件夹中再新建一个文件。test_suite.py

# -*- coding: utf-8 -*-
 
import unittest
from test_mathfunc import TestMathFunc
 
if __name__ == '__main__':
    suite = unittest.TestSuite()
 
    tests = [TestMathFunc("test_add"), TestMathFunc("test_minus"), TestMathFunc("test_divide")]
    suite.addTests(tests)
 
    runner = unittest.TextTestRunner(verbosity=2)
    runner.run(suite)

执行情况跟我们预料的一样,执行了三个case,并且顺序是按照我们添加进去suite的顺序执行的。

将结果输出到文件中

修改test_suite.py

# -*- coding: UTF-8 -*-
 
import unittest
from test_mathfunc import TestMathFunc
from HTMLTestRunner import HTMLTestRunner
 
if __name__ == '__main__':
    suite = unittest.TestSuite()
 
    #使用这种方法可以对测试用例排序
    #tests = [TestMathFunc("test_add"), TestMathFunc("test_minus"), TestMathFunc("test_divide")]
    #suite.addTests(tests)
    
    #使用TestLoader的方法传入TestCase
    suite.addTests(unittest.TestLoader().loadTestsFromTestCase(TestMathFunc))
 
    #在同目录下生成txt格式的测试报告
    #with open('UnittestTextReport.txt', 'a') as f:
        #runner = unittest.TextTestRunner(stream=f, verbosity=2)
        #runner.run(suite)
 
    with open('HTMLReport.html','w') as f:
        runner = HTMLTestRunner(stream = f,
                                title = u'测试报告',
                                description = u'测试用例的执行情况',
                                verbosity = 2
                                )
        runner.run(suite)

执行此文件,可以看到,在同目录下生成了一个TXT文件;也可以把测试结果以html的格式输出到页面上。

执行结果如下:

2.png

在网页中打开测试报告:

3.png

小结:

1、unittest是python自带的单元测试框架,可以用来作为我们自动化测试框架的用例组织执行框架

2、unittest流程:写好TestCase,然后由TestLoader加载TestCase到TestSuite,然后由TextTestRunner来运行TestSuite,运行的结果保存在TextTestResult中,我们通过命令行或者unittest.main()执行时,main会调用TextTestRunner中的run来执行,或者我们可以直接通过TextTestRunner来执行用例。

3、一个class继承unittest.TestCase即是一个TestCase,其中以 test 开头的方法在load时被加载为一个真正的TestCase。

4、verbosity参数可以控制执行结果的输出,0 是简单报告、1 是一般报告、2 是详细报告。

5、可以通过addTest和addTests向suite中添加case或suite,可以用TestLoader的loadTestsFrom__()方法。

6、用 setUp()、tearDown()、setUpClass()以及 tearDownClass()可以在用例执行前布置环境,以及在用例执行后清理环境

7、我们可以通过skip,skipIf,skipUnless装饰器跳过某个case,或者用TestCase.skipTest方法。

8、参数中加stream,可以将报告输出到文件:可以用TextTestRunner输出txt报告,以及可以用HTMLTestRunner输出html报告。


作者:何烨坪Echo

原文链接:https://blog.csdn.net/heye13/article/details/81627538


  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          •   参数化概念  测试工作中,通常会使用不同的数据发送请求测试不同的场景来实现测试的全面性,这就需要对一些字段进行参数化,以使每次迭代都使用不同的数据来满足我们的测试需求。  Jmeter做为常用的功能、性能测试工具之一,其参数化方式也是相对比较灵活,主要分为4种:用户参数、用户自定义变量、CSV数据文件、函数助手,下面将详细介绍这4种参数化方式的使用方法。  参数化方式  一、用户参数  1.使用场景  适用于参数取值范围很小的场景,例如测试模拟较少用户登陆某系统交易。  2.操作步骤  (1)添加用户参数功能模块  (2)设置参数变量、用户值  注意勾选每次迭代更新一次,否则每次都使用同样...
            14 15 1497
            分享
          • 基本技术问题:游戏测试的基本流程:分析测试需求-制定测试计划-设计测试用例-(可能会进行冒烟测试)-执行测试-生成测试报告OSI七层协议:应用层-表示层-会话层-传输层-网络层-数据链路层-物理层TCP与UDP的差别:游戏测试与软件测试之间的关系:1、游戏测试是软件测试的一部分游戏测试简单说就是发现游戏里的问题(BUG)并进行改进,从而提升游戏产品的质量。游戏测试作为软件测试的一部分,它具备了软件测试所有的一切共同的特性:①测试的目的是发现软件中存在的缺陷。②测试都是需要测试人员按照产品行为描述来实施。产品行为描述可以是书面的规格说明书,需求文档,产品文件,或是用户手册,源代码,或是工作的可执...
            3 3 1864
            分享
          • 当面对大量用户模拟和性能测量需求时,单台计算机运行 JMeter 往往显得力不从心。因此,构建一个多节点的JMeter集群成为了一种提升测试性能的有效途径。接下来,本文将详细介绍如何组建和配置一个JMeter测试集群。一、准备工作:服务器搭建首先,我们需要数台性能相匹配的服务器,每台服务器都需装备如下:Java运行环境必须预装好。各服务器间应保持通信畅通,可通过SSH或RDP等手段实现。二、安装环节:搞定JMeter接下来,在每台机器上部署JMeter。可从JMeter的官方网站下载最新版本的安装包并顺利安装。安装后务必配置 环境变量,操作如下:在服务器的 ~/.bashrc&nbs...
            0 0 828
            分享
          •   YouTube 宣布了一系列 YouTube Shorts短视频相关的新功能,其中一些现在就可以使用,比如新的文本到语音视频旁白可以让你添加人工配音。  在 TikTok 上,有时你会在一些宣传视频中听到令人惊愕的机器人声音。事实上,YouTube添加语音的过程与 TikTok 很相似:创建一些文本后,点击屏幕左上角的一个新的"添加语音"图标,然后选择你想要的语音。YouTube 目前只提供四种语音供你选择,而 TikTok 则有更多。  YouTube 表示,它还将推出自动生成的字幕,用户可以将其添加到视频中而无需切换到另一个应用程序(如 CapCut)。与现有的 Y...
            0 0 293
            分享
          • 1.何为冒烟测试冒烟测试是自由测试的一种。冒烟测试在测试中发现问题,找到了一个bug,然后开发人员会来修复这个bug。这时想知道这次修复是否真的解决了程序的bug,或者是否会对其它模块造成影响,就需要针对此问题进行专门测试,这个过程就被称为冒烟测试。在很多情况下,做冒烟测试是开发人员在试图解决一个问题的时候,造成了其它功能模块一系列的连锁反应,原因可能是只集中考虑了一开始的那个问题,而忽略其它的问题,这就可能引起了新的bug。冒烟测试引入到软件测试中,是指测试人员在正规测试一个新版本之前,先投入较少的人力和时间验证一个软件的主要功能,如果主要功能都没有实现,则打回开发组重新开发。这样做的好处是...
            12 12 2502
            分享
      • 51testing软件测试圈微信