川石教育
全国咨询热线:136-9172-9932
  1. 首页 > 资讯与干货 > IT资讯

Python单元测试框架--Unittest

作者:川石学院 日期:2021-11-02 11:43:18 点击数:

一天一个关于测试知识点,5分钟内讲解你最关心的软件测试问题,今天就来谈谈关于软件测试中的“Python单元测试框架--Unittest”。

Python单元测试框架--Unittest(图1)

unittest概述

unittest是Python中有一个自带的单元测试框架,用它可以来做单元测试,同时也是一个测试框架,unittest也属于XUnit系列,符合XUnit的一些规则。下面代码是用Python写的一个建议的计算器。

案例2-5:用unittest框架实现测试简易计算器。

#!/usr/bin/env python

#coding:utf-8


__metaclass_=type


class calculator:

    def __init__(self,a,b):

        self.a=int(a)

        self.b=int(b)


    def myadd(self):

        return self.a+self.b


    def mysubs(self):

        return self.a-self.b

    

    def mymultiply(self):

        return self.a*self.b

    

    def mydivide(self):

        try:

            return self.a/self.b

        except ZeroDivisionError:

            print ("除数不能为零")

            return 0

calculator类包含了两个类变量:a和b,分别为计算器的两个操作对象。方法myadd、musub、 mymultiply和mydivide方法分别实现加、减、乘、除四个功能。现在来测试这几个功能,代码如下。

#!/usr/bin/env python

#coding:utf-8

# pip install coverage

# coverage run Calculatortest.py

# coverage report -m

import unittest

from Calculator import calculator


class calculatortest(unittest.TestCase):

        def setUp(self):

                print ("Test start!")

        #最简单的加减乘除测试

        def test_base(self):

                j=calculator(4,2)

                self.assertEqual(j.myadd(),6)

                self.assertEqual(j.mysubs(),2)

                self.assertEqual(j.mymultiply(),8)

                self.assertEqual(j.mydivide(),2)

   

#测试大的数字,为最大的long long有符号数字

def test_max_number(self):

                j=calculator(9223372036854775808,9223372036854775808)

                self.assertEqual(j.mymultiply(),85070591730234615865843651857942052864)


#专门测试减法,结果分别为正数、负数和0,这里用列表作为测试数据,列表中每一个元素也为列表,子列表中包括三个参数,分别为被减数、减数和期待的差值

        def test_subs(self):

                mydata = [[4,2,2],[2,4,-2],[4,4,0]]

                n=0

                for i in mydata:     

                        j=calculator(mydata[n][0],mydata[n][1])

                        self.assertEqual(j.mysubs(),mydata[n][2])

                        n+=1

  #专门测试乘法,分别为正数乘正数、正数乘负数、负数乘正数、负数乘负数,参数同test_subs

        def test_multiply(self):

                mydata = [[4,2,8],[4,-2,-8],[-4,2,-8],[-4,-2,8]]

                n=0

                judge=True

                for i in mydata:

                        j=calculator(mydata[n][0],mydata[n][1])

                        self.assertEqual(j.mymultiply(),mydata[n][2])

                        n+=1

   

#测试除法中除数等于0

        def test_divide(self):              

                j=calculator(4,0)

                self.assertEqual(j.mydivide(),0)


        def tearDown(self):

                print ("Test end!")

                

if __name__=='__main__':

        #构造测试集

        suite=unittest.TestSuite()

        suite.addTest(calculatortest("test_base"))

suite.addTest(calculatortest("test_max_number"))

        suite.addTest(calculatortest("test_subs"))

        suite.addTest(calculatortest("test_multiply"))

        suite.addTest(calculatortest("test_divide"))

        #运行测试集合

        runner=unittest.TextTestRunner()

        runner.run(suite)

使用unittest在程序开始import unittest引入unittest类。由于unittest是继承与unittest.TestCase基类的,所以class后面括号内必须为unittest.TestCase。unittest类似于JUnit 3,没有@Before、@After等标签,而是通过方法名来表示。等价于@Before的方法为setUp(),等价于@After的方法为tearDown (),等价于@test的方法为test_XXX ()(以“test_”开始的方法名)。同样的方法还有如下装饰器,见表2-3所示。

表2-3 unittest的装饰器

Python单元测试框架--Unittest(图2)

下面方法是利用@parameterized.expand参数化来改造案例2-5中的test_multiply和test_subs。使用parameterized前必须先用pip3把parameterized下载下来。

C:\Users\xiang>pip3 install parameterized

Collecting parameterized

  Downloading https://files.pythonhosted.org/packages/d6/9b/5830b778f213ada36528d1c54fdc0a67178e6edd7c44ed59074851ebb2e7/parameterized-0.7.0-py2.py3-none-any.whl

Installing collected packages: parameterized

Successfully installed parameterized-0.7.0

  代码如下。

  案例2-6:利用parameterized参数化unittest 测试用例。

from parameterized import parameterized

@parameterized.expand([

                (4,2,2,),

                (2,4,-2,),

                (4,4,0,),

        ])

        def test_mysubs(self,a,b,p):

                self.assertEqual(calculator(a,b).mysubs(),p)


        @parameterized.expand([

                (4,2,8,),

                (4,-2,-8,),

                (-4,2,-8,),

                (-4,-2,8,),

        ])

        def test_mymultiply(self,a,b,p):

                self.assertEqual(calculator(a,b).mymultiply(),p)

if __name__=='__main__':

        #构造测试集

        suite=unittest.TestSuite()

        #使用参数话必须要用makeSuite,而不能用suite.addTest,否则会报错

suite = unittest.makeSuite(calculatortest) 

        #运行测试集合

        runner=unittest.TextTestRunner()

        runner.run(suite)

  由此可见,parameterized.expand list中的每个括号内的元素对应测试入参的相应的变量,这里与JUnit4参数化有些类似。(注意:由于list中每个元素是一个元祖,所以最后一个参数后必须有一个逗号,比如“(4,2,8,)”)


相关文章
  • 亚马逊运营成功转行软件测试,薪资13K表示很满意!2021-11-02 11:43:18
  • 西安川石的兰朋友喊你来当他的学弟学妹啦!2021-11-02 11:43:18
  • 国外的月亮也不一定比国内测试猿的年薪美~2021-11-02 11:43:18
  • 建筑工程专业朱同学成功转行为软件测试人!2021-11-02 11:43:18
  • 财务管理专业转行软件测试月薪甩会计几条街!2021-11-02 11:43:18
  • 只有技术沉淀才能成功上岸,深圳就业薪资13K!2021-11-02 11:43:18
  • 薪资11K!实现自我价值,从掌握一门IT技术开始...2021-11-02 11:43:18
  • 文科生转行软件测试照样拿下高薪15K!2021-11-02 11:43:18
  • 恭喜罗同学喜提19.5K,成功入行软件测试!2021-11-02 11:43:18
  • 毕业1年,迷茫的他最终选择转行软件测试2021-11-02 11:43:18