单元测试工具(连载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小时。

目录
相关文章
|
17天前
|
前端开发 Java jenkins
Jmeter压力测试工具全面教程和使用技巧。
JMeter是一个能够模拟高并发请求以检查应用程序各方面性能的工具,包括但不限于前端页面、后端服务及数据库系统。熟练使用JMeter不仅能够帮助发现性能瓶颈,还能在软件开发早期就预测系统在面对真实用户压力时的表现,确保软件质量和用户体验。在上述介绍的基础上,建议读者结合官方文档和社区最佳实践,持续深入学习和应用。
360 10
|
2月前
|
敏捷开发 运维 数据可视化
DevOps看板工具中的协作功能:如何打破开发、测试与运维之间的沟通壁垒
在DevOps实践中,看板工具通过可视化任务管理和自动化流程,提升开发与运维团队的协作效率。它支持敏捷开发、持续交付,助力团队高效应对需求变化,实现跨职能协作与流程优化。
|
3月前
|
数据可视化 测试技术 Go
Go 语言测试与调试:`go test` 工具用法
`go test` 是 Go 语言内置的测试工具,支持单元测试、基准测试、示例测试等功能。本文详解其常用参数、调试技巧及性能测试命令,并提供实际项目中的应用示例与最佳实践。
|
3月前
|
Java 测试技术 容器
Jmeter工具使用:HTTP接口性能测试实战
希望这篇文章能够帮助你初步理解如何使用JMeter进行HTTP接口性能测试,有兴趣的话,你可以研究更多关于JMeter的内容。记住,只有理解并掌握了这些工具,你才能充分利用它们发挥其应有的价值。+
683 23
|
2月前
|
人工智能 数据可视化 测试技术
UAT测试排程工具深度解析:让验收测试不再失控,项目稳稳上线
在系统交付节奏加快的背景下,“测试节奏混乱”已成为项目延期的主因之一。UAT测试排程工具应运而生,帮助团队结构化拆解任务、清晰分配责任、实时掌控进度,打通需求、测试、开发三方协作闭环,提升测试效率与质量。本文还盘点了2025年热门UAT工具,助力团队选型落地,告别靠表格和群聊推进测试的低效方式,实现有节奏、有章法的测试管理。
|
3月前
|
弹性计算 JavaScript Ubuntu
WebSocket协议相关的测试命令工具使用简介
本文介绍了针对WebSocket的测试工具wscat和websocat的基本使用方法,以及通过curl命令测试HTTP/HTTPS协议的方式。对于WebSocket,直接使用curl测试较为复杂,推荐使用wscat或websocat。文中详细说明了这两种工具的安装步骤、常用参数及连接示例,例如在ECS上开启8080端口监听并进行消息收发测试。此外,还提供了curl命令的手动设置头部信息以模拟WebSocket握手的示例,但指出curl仅能作为客户端测试工具,无法模拟服务器。
644 4
|
9月前
|
Java 测试技术 数据安全/隐私保护
软件测试中的自动化策略与工具应用
在软件开发的快速迭代中,自动化测试以其高效、稳定的特点成为了质量保证的重要手段。本文将深入探讨自动化测试的核心概念、常见工具的应用,以及如何设计有效的自动化测试策略,旨在为读者提供一套完整的自动化测试解决方案,帮助团队提升测试效率和软件质量。
|
5月前
|
SQL 安全 测试技术
2025接口测试全攻略:高并发、安全防护与六大工具实战指南
本文探讨高并发稳定性验证、安全防护实战及六大工具(Postman、RunnerGo、Apipost、JMeter、SoapUI、Fiddler)选型指南,助力构建未来接口测试体系。接口测试旨在验证数据传输、参数合法性、错误处理能力及性能安全性,其重要性体现在早期发现问题、保障系统稳定和支撑持续集成。常用方法包括功能、性能、安全性及兼容性测试,典型场景涵盖前后端分离开发、第三方服务集成与数据一致性检查。选择合适的工具需综合考虑需求与团队协作等因素。
572 24
|
6月前
|
JSON 测试技术 网络安全
Apifox工具让我的 Socket.IO 测试效率翻倍
用了 Apifox 测试 Socket.IO 后,我整个人都升级了!不仅操作简单到令人发指,功能还贼全面,真的是 提升开发效率的神器 !
|
10月前
|
监控 网络协议 Java
一些适合性能测试脚本编写和维护的工具
一些适合性能测试脚本编写和维护的工具
350 59