互联网服务端接口自动化是各个公司都须要一部分业务,如何快速高效地完成接口测试呢?面试
以帮助你们实现高效的接口测试为出发点,本文包含了我在互联网接口测试领域的一些方法和心得,但愿你们一块儿讨论和分享,内容包括但不只限于:算法
互联网服务端接口测试介绍;数据库
接口测试经常使用的工具、平台、框架;编程
接口测试的一些问题和实践。浏览器
下图是经典的测试金字塔,服务接口测试在中部,承上启下,因而可知其重要性。缓存
互联网服务端接口测试介绍安全
目前市场上有不少支持接口测试的工具,可以提升测试效率。可是让你一天完成100个接口测试任务,你以为可能吗?服务器
你可能会说有工具就行,但不是全部工具都能支持你完成这个任务。下图是我挑选的几款工具:网络
1. fiddler数据结构
fiddler是一个 HTTP 协议调试代理工具,Web和手机测试都会用到,同时也支持接口测试。后面我会专门介绍。
2. postman
它是 Google 开发的一个插件,安装在 Chrome 浏览器上,能支持不一样接口测试请求,能够管理测试套件和自动化运行。弱点是自动化断言功能不强大,不能和 Jenkins、代码管理库进行持续集成测试。
可是,它绝对是一个很好的半手工、半自动化测试工具。我通常在写自动化接口测试用例,会打开 postman 进行辅助测试和 Debug,下文会有介绍。
3. wireshak
这是一款抓包工具,支持 TCP、UDP、HTTP 。若是作底层网络数据测试,通常都须要用到它,可是用做接口测试,它就有点不友好。由于刷新数据太快,很差定位每一个操做对应的接口。因此,在这里就不过多介绍该工具。
4. soupUI
这是一款提供有开源免费版和企业收费版的软件。在国外的接口测试中,使用较多。该工具可以支持接口自动化测试和接口性能测试,也支持和 Jenkins 作持续集成测试。了解一下就能够,能够下载一个社区免费版,作一个 Demo 试试。
5. Java 代码作接口测试
为何要用代码作接口自动化测试呢?一些工具功能是有限制,不少公司须要一些特定的功能,工具不支持,只好用代码进行开发。通常用 Java 作自动化测试,主要利用 httpclient.jar 包,而后利用 JUnit 或者 TestNG 这样的单元测试工具,进行测试用例的开发,接着在 Jenkins 上建立一个 job,进行持续集成测试。
6. Python 代码作接口测试
和 Java 同样,用 Python 作接口测试,能够利用一个功能强大的第三方库 Requests,它能方便地建立接口自动化用例。Python 下的单元测试框架,通常采用unittest。生成测试报告,通常选择 HTMLTestRunner.py。一样,能够结合 Jenkins 作持续集成测试。
7. LoadRunner
不要觉得 LoadRunner 只能作性能测试,它一样能够作接口自动化和接口压力测试。只是咱们不少人,不会利用 LoadRunner 的函数,设计接口测试用例。
8. JMeter
JMeter 同 LoadRunner 同样,都以性能测试出名,通常用 JMeter 也是作接口性能测试。例如 Java+Jmeter+Ant+Jenkins 作接口性能监听测试。JMeter 如何作接口测试,能够查阅官方文档和 CSDN 博客专栏《JMeter 性能测试》 。
上面说了这么多工具,基本覆盖了接口功能测试、接口自动化测试、接口性能测试。这里提一下,推荐 Python 语言下的一个性能测试工具 Locust。本身百度并安装下,很简单的 Web 界面,做为一个轻量级的协程测试工具,感受很不错。
服务端测试也应该具有一些计算机基础知识的能力,例以下面几个领域的知识。
操做系统和网络
互联网里最大的应用场景就是高并发、高可用、高性能的线上服务,作这类系统实际上考验的是咱们对操做系统和网络的理解。任何一个系统最后都是运行在操做系统之上的,也都运行在网络之上的,包括分布式系统,因此,须要在操做系统和网络上必定要有较深的造诣,尤为是高并发和高性能。
若是对操做系统原理一无所知,基本很难理解什么是并发和锁,很难理解高性能用什么指标来衡量,以及怎么实现高并发、高可用和高性能。
对于操做系统,咱们必须了解 CPU 的多核体系结构、内存分页和缓存技术、磁盘 IO 的优略和网卡 IO 的状况,而且要理解计算机的工做原理,会根据这些指标粗略评估服务可以输出的性能。
对于网络,必须理解理论上定义的7层模型,了解 TCP/IP 的三次握手。另外咱们在分布式服务架构中多数使用应用层的HTTP协议,因此还须要对 HTTP 协议有很深入的理解。
算法和数据结构
应用层面的小伙伴们可能对算法和数据结构的应用比较少,即便有应用也比较简单,可是算法能力表明了一我的的逻辑思惟和思考能力,能把各类基础算法理解的人智商都不会低,可以把程序写好的人逻辑思惟必定很强。
通常在面试小伙伴的时候,我都会考察一下他会不会高级算法,例如递归、剪枝、贪婪、动态规划。仔细想一下就会知道,会动态规划的人,他不是勤奋的就是聪明的,不管哪同样,你都有录取他的冲动。
线上高并发服务方向
线上高并发服务是个强需求,不管你开发哪类应用和网站,线上服务都是必须的,有了服务才有了功能,才有了产品,我也主要从事互联网后台高并发服务的设计与实现。
解决高并发服务其实并无那么难,这些年高并发服务的技术栈也已经没有了门槛,只要投入足够的成本,构建可伸缩的服务不是问题,达到多大的 TPS 也都不是问题,核心思想就是“分而治之,大而化下,小而化了”。
咱们使用的缓存抗读、消息队列抗写、数据库分库分表、缓存分片、应用层伸缩、减小竞争、7层负载均衡、三四层负载均衡等,以及 CDN、DNS 轮训等等,这一切都是“分而治之”的思想。
大数据方向
大数据是最近比较火的方向,大小公司都在使用大数据技术。大公司使用大数据分析技术从众多数据中分析出业务模型,得出有价值的结果,来帮助企业制定市场和销售策略,中小公司多数使用大数据出报表和作风控等。
全部的大数据技术的根基都来自 Mapreduce、GFS 和 Bigtable 这三篇论文,推荐你们阅读这些论文:
MapReduce: Simplifed Data Processing on Large Clusters
The Google File System
Bigtable: A Distributed Storage System for Structured Data
理解了这些基础技术原理,再去学习 Hadoop、HBase、Storm、Spark、Cassandra、MongoDB、ES 等都不是问题。
接口测试经常使用的工具、平台、框架
自动化测试能够快速自动完成大量测试用例,节约巨大的人工测试成本;同时须要拥有专业开发技能的人才能完成开发,且须要大量时间进行维护(在需求常常变化的状况下),因此大部分具备很好开发技能的人员不是很愿意编写自动化用例。但因为软件规模的高速增加,人力资源的逐步稀缺,自动化测试已经是势在必行。
下面是我精选的8个 Java 测试工具和框架。
1. Arquillian
Arquillian 是一个基于 JVM 高度创新性和可扩展的测试平台,容许 Java 开发人员轻松建立自动化集成、功能和验收测试。Arquillian 容许在运行时间执行测试。能够用来管理单个或多个容器的生命周期,捆扎测试用例、从属类和资源。它还可以部署归档到容器中,在容器中执行测试、捕获结果,并建立报告。它集成了常见的测试框架,如 JUnit 四、TestNG 5,并容许使用现有的 IDE 发布测试,而且因为模块化的设计使其可以运行 Ant 和 Maven 测试插件。
2. JTest
JTest 也被称为“Parasoft JTest”,是一款由 Parasoft 公司推出的自动化 Java 软件测试和静态分析软件。JTest包含的功能有:单元测试状况下的生成和执行、静态代码分析、数据流的静态分析、度量分析、回归测试、运行时错误检测。此外,它还具有了同行代码审查流程自动化和运行时错误检测的功能,如竞态条件、异常、资源和内存泄漏、安全漏洞攻击。
3. The Grinder
The Grinder 是一个 Java 负载测试框架,运行简单,且其分布式测试采用了许多负载注入机器。只要有 Java API,The Grinder 就能够进行负载测试。这包括 HTTP Web 服务器、SOAP 和 REST Web 服务器、应用程序服务器,以及用强大的 Jython 和 Clojure 语言写的包含了自定义协议的测试脚本。
The Grinder 的 GUI 控制台容许对多个负载注射器进行监测和控制,并自动管理客户端链接和 Cookies、SSL、代理感知和节流链接。 The Grinder 在 BSD 风格的开源许可下是免费的。 官方网站:Downloading The Grinder
4. TestNG
TestNG 是一款为 Java 编程语言设计的测试框架,灵感来自于 JUnit 和 NUnit。TestNG 可覆盖范围更广的测试类型,如单元、功能性、端到端、一体化等。它还有一些新的功能,可使之更强大和更容易使用,如注解、具有大型线程池各类策略的运行测试、多线程的代码测试、灵活的测试配置、参数化数据驱动的测试支持等等。TestNG 支持各类各样的工具和插件,好比 Eclipse、IDEA、Maven 等等。
5. JUnit
JUnit 是一个为 Java 编程语言设计的单元测试框架。JUnit 为测试驱动开发框架的发展发挥了重要做用。它是如今被统称为 xUnit 的单元测试框架你们庭的组成成员之一,源于 SUnit。在编译时,JUnit 能够链接做为 JAR,用于编写可重复的测试。
6. Powermock
PowerMock 是一款支持单元测试源代码的 Java 框架。虽然 PowerMock 能够做为 Mocking 框架,例如做为 Mockito 和 EasyMock 的扩展而运行,但它还具有更强大的能力。PowerMock 利用自定义的类加载器和字节码操纵器,来确保静态方法的模拟、静态初始化的删除、函数构造、最终的类和方法以及私有方法。它的主要目的是经过最少的方法和注释来扩展示有的 API,以得到额外的功能。
7. Cucumber
Cucumber 是 BDD 模式下实现可执行规范(Executable Specifications)的开源工具,可是它的使命并不局限于作自动化验收测试,更加剧要的在于其可以在团队成员之间构建统一的交流基础(feature 文件)、规范交流用语(Domain Specific Language)、提升各个利益相关方(Business Stakeholders)沟通效率和效果,从而达到提高产品质量、作出客户指望获得的产品这一最终目标。
8. Python Unittest
Python 单元测试框架 Unittest,是基于 Java 中流行单元测试框架 JUnit 设计的,其功能强大且灵活,对于熟悉 JUnit 的人来讲,掌握 Unittest 很简单。
Unittest 涉及的知识点较多,但核心的只有一部分,本文将介绍它最核心和基础的内容。
相似 JUnit,使用 Unittest 编写 Python 的单元测试代码,包括以下几个步骤:
编写一个 Python 类,继承 Unittest 模块中的 TestCase 类,这就是一个测试类。
在上面编写的测试类中定义测试方法(这个就是指的测试用例),每一个方法的方法名要求以 test 打头,没有额外的参数。在该测试方法中调用被测试代码,校验测试结果,TestCase 类中提供了不少标准的校验方法,如最多见的 assertEqual。
执行 unittest.main() ,该函数会负责运行测试,它会实例化全部 TestCase 的子类,并运行其中全部以 test 打头的方法。
如下是Python Unittest 测试用例执行的关系图。
咱们下面看一些例子,编写以下的 Python文件。
(1)手工加载批量用例。
import unittestclass TestOne(unittest.TestCase): def setUp(self): print '\ncases before' pass def test_add(self): '''test add method''' print 'add...' a = 3 + 4 b = 7 self.assertEqual(a, b) def test_sub(self): '''test sub method''' print 'sub...' a = 10 - 5 b = 5 self.assertEqual(a, b) def tearDown(self): print 'case after' passif __name__ == '__main__': # 一、构造用例集 suite = unittest.TestSuite() # 二、执行顺序是安加载顺序:先执行test_sub,再执行test_add suite.addTest(TestOne("test_sub")) suite.addTest(TestOne("test_add")) # 三、实例化runner类 runner = unittest.TextTestRunner() # 四、执行测试 runner.run(suite)
(2)自动加载批量用例。
import unittestimport osclass TestOne(unittest.TestCase): def setUp(self): print '\ncases before' pass def test_add(self): '''test add method''' print 'add...' a = 3 + 4 b = 7 self.assertEqual(a, b) def test_sub(self): '''test sub method''' print 'sub...' a = 10 - 5 b = 5 self.assertEqual(a, b) def tearDown(self): print 'case after' passif __name__ == '__main__': # 一、设置待执行用例的目录 test_dir = os.path.join(os.getcwd()) # 二、自动搜索指定目录下的cas,构造测试集,执行顺序是命名顺序:先执行test_add,再执行test_sub discover = unittest.defaultTestLoader.discover(test_dir, pattern='test_*.py') # 实例化TextTestRunner类 runner = unittest.TextTestRunner() # 使用run()方法运行测试套件(即运行测试套件中的全部用例) runner.run(discover)
接口测试的一些问题和实践
以 TestNG 为例,它是一套根据 JUnit 和 NUnit 思想而构建的利用注释来强化测试功能的一个测试框架。TestNG 设计涵盖全部类型的测试,如单元、功能、端到端、集成等。学习 TestNG 以前须要先学习编程语言 Java、配置本地 JDK 环境(JDK1.5 版本或以上)和安装 Java 开发工具 Eclipse。
接下来,咱们一块儿来学习 TestNG。
1. 在 Eclipse 中安装 TestNG。
打开 Eclipse Help -> MarketPlace,在搜索框里面输入 TestNG 搜索,而后安装 TestNG 插件。
2. 安装成功后,在项目的 package 上右键能够看到 TestNG -> Create TestNG class。
这里能够勾选 TestNG 的注解方法,主要注解方式有:
@BeforeSuite:被此注解的方法将在全部测试运行以前运行该方法。
@AfterSuite:被此注解的方法将在全部测试运行以后运行该方法。
@BeforeTest:被此注解的方法,将在测试运行以前运行。
@AfterTest:被此注解的方法,将在测试运行以后运行。
@BeforeClass:被此注解的方法,将在当前类的第一个测试方法调用以前运行。
@AfterClass:被此注解的方法,将在当前类的全部测试方法调用以后运行。
@BeforeMethod:被此注解的方法,将在每一个测试方法调用以前运行。
@AfterMethod:被此注解的方法,将在每一个测试方法调用以后运行。
@DataProvider:标志着一个方法,提供数据的一个测试方法。
至此环境搭建完成,能够开始写测试的 case 了。
3. 从一个简单的测试 case 开始入手,代码以下:
package com.pingan.ff.zijin;import org.testng.annotations.Test;import org.testng.annotations.DataProvider;import org.testng.annotations.BeforeTest;import org.testng.annotations.AfterTest;public class NewTest { @Test(dataProvider = "dp") public void f(Integer n, String s) { System.out.println("第一个参数是"+n+",第二个参数是"+s); } @DataProvider public Object[][] dp() { return new Object[][] { new Object[] { 1, "a" }, new Object[] { 2, "b" }, }; } @BeforeTest public void beforeTest() { System.out.println("------------开始测试------------"); } @AfterTest public void afterTest() { System.out.println("------------结束测试------------"); } }
右键 Run As -> TestNG Test,运行后结果以下图所示。
从测试的结果能够看到执行的顺序是 beforeTest() -> Test() -> afterTest(),同时 Test() 方法从 dataProvider dp 里面接收参数。以下图所示。
转自公众号:CSDN技术头条
做者:SoftwareLuke
连接地址:https://mp.weixin.qq.com/s?__biz=MzA4Mzc0NjkwNA==&mid=2650784584&idx=1&sn=934fbedff493e622671ef93f6f97cc46&chksm=87faaa7fb08d2369822f988cf8080f285cf2abc50524c9662d96b71140617e3235ae9955adae&mpshare=1&scene=23&srcid=0327GWQGY3J7WLUuOrAOVaHC%23rd