单元测试工具(连载8)

简介: 单元测试工具(连载8)

2.4 TestNG的装饰器

前面介绍了TestNG的使用,下面来看一下TestNG的装饰器,如表2所示。


2                                                             TestNG的装饰器

注解

描述

@BeforeSuite

注解的方法将只运行一次,运行所有测试前此套件中。

@AfterSuite

注解的方法将只运行一次,此套件中的所有测试都运行之后。

@BeforeClass

注解的方法将只运行一次先行先试在当前类中的方法调用。

@AfterClass

注解的方法将只运行一次后已经运行在当前类中的所有测试方法。

@BeforeTest

注解的方法将被运行之前的任何测试方法属于内部类的 <test>标签的运行。

@AfterTest

注解的方法将被运行后,所有的测试方法,属于内部类的<test>标签的运行。

@BeforeGroups

组的列表,这种配置方法将之前运行。此方法是保证在运行属于任何这些组第一个测试方法,该方法被调用。

@AfterGroups

组的名单,这种配置方法后,将运行。此方法是保证运行后不久,最后的测试方法,该方法属于任何这些组被调用。

@BeforeMethod

注解的方法将每个测试方法之前运行。

@AfterMethod

被注释的方法将被运行后,每个测试方法。

@DataProvider

标志着一个方法,提供数据的一个测试方法。注解的方法必须返回一个Object[][],其中每个对象[]的测试方法的参数列表中可以分配。

@Test 方法,希望从这个DataProvider的接收数据,需要使用一个dataProvider名称等于这个注解的名字。

@Factory

作为一个工厂,返回TestNG的测试类的对象将被用于标记的方法。该方法必须返回Object[]

@Listeners

定义一个测试类的监听器。

@Parameters

介绍如何将参数传递给@Test方法。

@Test

标记一个类或方法作为测试的一部分。


3  Python单元测试框架unittest


3.1 unittest概述

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


案例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)
    defmyadd(self):
       return self.a+self.b
    defmysubs(self):
       return self.a-self.b
    defmymultiply(self):
       return self.a*self.b
    defmydivide(self):
        try:
           return self.a/self.b
       except ZeroDivisionError:
           print ("除数不能为零")
           return 0


calculator类包含了两个类变量,ab,分别为计算器的两个操作对象。方法myaddmusub mymultiplymydivide方法分别实现加、减、乘、除功能。现在来测试这几个功能,代码如下。


#!/usr/bin/env python
#coding:utf-8
# pip install coverage
# coveragerun Calculatortest.py
# coveragereport -m
import unittest
from Calculator import calculator
class calculatortest(unittest.TestCase):
        defsetUp(self):
               print ("Test start!")
        #最简单的加减乘除测试
        deftest_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,这里用列表作为测试数据,列表中每一个元素也为列表,子列表中包括三个参数,分别为被减数、减数和期待的差值
        deftest_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
        deftest_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
        deftest_divide(self):             
               j=calculator(4,0)
               self.assertEqual(j.mydivide(),0)
        deftearDown(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在程序开始importunittest引入unittestclass的参数必须为unittest.TestCase unittest类似于JUnit 3,没有@Before@After等标签,而是通过方法名来表示。等价于@Before的方法为setUp(),等价于@After的方法为tearDown (),等价于@test的方法为test_XXX ()(以“test_”开始的方法名)。同样的方法还有如下装饰器,见表3所示。


3                                                              unittest的装饰器

装饰器

介绍

@classmethod

def setUpClass(cls):

在整个类运行前执行只执行一次

@classmethod

def tearDownClass(cls) :

在整个类运行后执行只执行一次

@unittest.skip(reason): skip(reason)

无条件跳过装饰的测试,并说明跳过测试的原因

@unittest.skipIf(reason): skipIf(condition,reason)

条件为真时,跳过装饰的测试,并说明跳过测试的原因

@unittest.skipUnless(reason): skipUnless(condition,reason)

条件为假时,跳过装饰的测试,并说明跳过测试的原因

@unittest.expectedFailure(): expectedFailure()

测试标记为失败

@parameterized.expand

测试参数化


下面方法是利用@parameterized.expand来改造案例5中的test_multiplytest_subs。使用parameterized前必须先用pipparameterized下载下来。

C:\Users\Jerry>pip3 install parameterized

Collecting parameterized

 Downloadinghttps://files.pythonhosted.org/packages/d6/9b/5830b778f213ada36528d1c54fdc0a67178e6edd7c44ed59074851ebb2e7/parameterized-0.7.0-pypy3-none-any.whl

Installing collected packages: parameterized

Successfully installed parameterized-0.7.0


代码如下。


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


from parameterized import parameterized
@parameterized.expand([
               (4,2,2,),
               (2,4,-2,),
               (4,4,0,),
        ])
        deftest_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,),
        ])
        deftest_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参数化有些类似。


星云测试

http://www.teststars.cc

奇林软件

http://www.kylinpet.com

联合通测

http://www.quicktesting.net


顾翔凡言:

k=(p+m)t

其中:

k为常数。

p:团队人员质量水平,为单位小时内产生的有效质量,单位为/h;

m:团队方法质量水平,为单位小时内产生的有效质量,单位为/h;

t:为单位质量产品的交付时间,单位为h。


在团队方法质量水平不变,团队人员质量水平提高的情况下,交付时间变短;

在团队人员质量水平不变,团队方法质量水平提高的情况下,交付时间变短;

团队人员质量水平与方法质量水平乘积决定了软件的质量水平,如果这个值变小,则t变大;反之t变小。


例如,当k=4时:

当人员质量水平为1/小时、方法水平为1/小时时,交付时间为2小时。

当人员质量水平为2/小时、方法水平为1/小时时,交付时间为4/3小时。

当人员质量水平为1/小时、方法水平为2/小时时,交付时间为4/3小时。

当人员质量水平为0.5/小时、方法水平为0.5/小时时,交付时间为4小时。

目录
相关文章
|
21天前
|
测试技术 C语言
网站压力测试工具Siege图文详解
网站压力测试工具Siege图文详解
27 0
|
2月前
|
JavaScript jenkins 测试技术
这10款性能测试工具,收藏起来,测试人的工具箱!
这10款性能测试工具,收藏起来,测试人的工具箱!
|
2月前
|
人工智能 监控 测试技术
利用AI辅助工具提升软件测试效率
【2月更文挑战第17天】 随着科技的不断发展,人工智能(AI)在各个领域的应用越来越广泛。在软件测试领域,AI技术也发挥着重要作用。本文将探讨如何利用AI辅助工具提升软件测试效率,包括自动化测试、智能缺陷识别和预测等方面。通过引入AI技术,软件测试过程将变得更加高效、准确和可靠。
202 1
|
2月前
|
测试技术
现代软件测试中的自动化工具与挑战
传统软件测试面临着越来越复杂的系统架构和不断增长的测试需求,自动化测试工具应运而生。本文将探讨现代软件测试中自动化工具的应用和挑战,深入分析其优势与局限性,为软件测试领域的发展提供思路和启示。
|
2月前
|
测试技术 持续交付
现代软件测试中的自动化工具应用与挑战
随着信息技术的快速发展,软件行业对于质量和效率的要求日益提高,自动化测试工具在软件开发过程中扮演着至关重要的角色。本文将探讨现代软件测试中自动化工具的应用现状以及所面临的挑战,旨在帮助开发人员更好地理解并充分利用这一技术手段。
|
3天前
|
机器学习/深度学习 数据采集 人工智能
【专栏】利用AI辅助工具提高软件测试效率与准确性
【4月更文挑战第27天】本文探讨了AI在软件测试中的应用,如自动执行测试用例、识别缺陷和优化测试设计。AI辅助工具利用机器学习、自然语言处理和图像识别提高效率,但面临数据质量、模型解释性、维护更新及安全性挑战。未来,AI将更注重用户体验,提升透明度,并在保护隐私的同时,通过联邦学习等技术共享知识。AI在软件测试领域的前景广阔,但需解决现有挑战。
|
2月前
|
jenkins 测试技术 持续交付
现代软件测试中的自动化工具与挑战
随着软件开发领域的不断发展,自动化测试工具在测试过程中扮演着越来越重要的角色。本文将探讨现代软件测试中自动化工具的应用及面临的挑战,旨在帮助开发人员和测试人员更好地理解和应对自动化测试中的问题。
|
1天前
|
IDE 测试技术 持续交付
探索自动化测试工具Selenium的高效应用
【4月更文挑战第29天】 在快速迭代的软件开发过程中,高效的测试策略是确保产品质量的关键。本文将深入探讨如何利用自动化测试工具Selenium来提高软件测试的效率和准确性。通过介绍Selenium的核心功能、脚本编写技巧以及与持续集成环境的集成方法,我们旨在为读者提供一个全面的Selenium应用指南。此外,我们还将讨论常见的问题解决策略,并通过案例分析展示如何有效地运用Selenium进行复杂的Web应用测试。
|
2天前
|
Java 测试技术 数据库连接
软件测试中的自动化工具及其应用
传统的软件测试方法已经不能满足日益增长的软件开发需求,因此自动化测试工具应运而生。本文介绍了几种常用的自动化测试工具,并探讨了它们在软件测试中的应用及优势。
7 0
|
9天前
|
敏捷开发 Java 测试技术
探索自动化测试工具Selenium Grid的高效应用
【4月更文挑战第21天】 随着敏捷开发和持续集成的理念深入人心,自动化测试已成为软件开发过程中不可或缺的一环。本文将深入探讨如何利用Selenium Grid进行高效的自动化测试。通过分析其工作原理,搭建过程,以及在实际项目中的应用案例,揭示Selenium Grid在处理大规模并发测试中的潜力和优势。文章不仅提供了具体的操作步骤,还讨论了优化策略,帮助读者构建更加稳定和高效的自动化测试环境。