http接口自动化测试框架实现

合集下载

接口自动化测试方案

接口自动化测试方案

接口自动化测试方案第1篇接口自动化测试方案一、前言随着信息化建设的不断深入,接口在各个系统间的数据交互中扮演着举足轻重的角色。

为确保接口稳定、可靠且高效地运行,降低系统上线后因接口问题导致的故障风险,提高软件质量,特制定本接口自动化测试方案。

二、目标1. 提高接口测试的效率,降低人工测试成本。

2. 实现对接口的全面覆盖,确保接口的稳定性和可靠性。

3. 建立可持续集成的自动化测试体系,为项目的快速迭代提供支持。

三、测试范围1. 系统内部接口:包括各模块间的数据交互接口。

2. 系统外部接口:包括与第三方系统或服务的接口。

3. 数据库接口:涉及数据库操作的接口。

四、测试工具及环境1. 测试工具:JMeter、Postman、Swagger等。

2. 测试环境:开发环境、测试环境、预生产环境、生产环境。

3. 数据库:MySQL、Oracle、SQL Server等。

五、测试策略1. 功能测试:验证接口的功能是否符合需求规格说明书。

2. 性能测试:评估接口在高并发、大数据量下的性能表现。

3. 安全测试:检查接口是否存在安全漏洞,如SQL注入、越权访问等。

4. 兼容性测试:验证接口在不同操作系统、浏览器、数据库等环境下的兼容性。

5. 异常测试:模拟各种异常场景,检查接口的容错性。

六、测试流程1. 需求分析:分析接口的业务需求,明确接口的功能、性能、安全等要求。

2. 测试设计:根据需求分析,编写接口测试用例。

3. 测试开发:搭建测试环境,编写自动化测试脚本。

4. 测试执行:在各个测试环境中执行自动化测试。

5. 结果分析:分析测试结果,定位问题原因,反馈给开发人员。

6. 跟踪验证:验证开发人员修复的问题,确保问题得到解决。

7. 测试报告:输出测试报告,包括测试覆盖率、通过率、问题列表等。

七、测试用例设计1. 根据接口文档,设计测试用例,包括正常场景、异常场景。

2. 测试用例应涵盖接口的功能、性能、安全等各个方面。

接口自动化测试框架搭建

接口自动化测试框架搭建

接⼝⾃动化测试框架搭建⼀、原理及特点 参数放在XML⽂件中进⾏管理 ⽤httpClient简单封装⼀个httpUtils⼯具类 ⽤例管理使⽤了testNg管理,使⽤了TestNG参数化测试,通过xml⽂件来执⾏case。

测试报告这⾥⽤到第三⽅的包ReportNG 项⽬组织⽤Maven⼆、准备 使⽤⼯具:eclipse,maven ⽤到的第三⽅jar包:dom4j、reportng、testng 理解难点:httpUtils和xmlUtil⼯具类的封装;dom4j使⽤;CookieStore的应⽤三、框架构思 1、项⽬结构 2、⽤例执⾏流程 3、接⼝调⽤流程 4、调度脚本流程四、框架实现 1、输⼊参数 1.1 参数放在XML⽂件中进⾏管理 例:这⾥测试获取⾓⾊的接⼝输⼊参数为,page和rows,mapRole.xml内容如下 <?xml version="1.0" encoding="UTF-8"?> <map> <bean beanName="GetRole"> <!--Locator lists --> <locator name="page" value="1"></locator> <locator name="rows" value="10"></locator> </bean> </map> 1.2 封装⼀个xmlUtil⼯具类负责读取XML,使⽤第三⽅的jar包dom4j 1.2.1 xmlUtil中readXMLDocument⽅法返回值为HashMap<String, String> public static HashMap<String, String> readXMLDocument(String beanName,String xmlName){ } 参数xmlName(xml⽂件的名字);参数beanName(xml⽂件中节点的名称); 1.3 封装⼀个CookieUtil⼯具类,通过CookieStore储存cookie 1.3.1 CookieUtil类中setCookieStore⽅法返回值为CookieStore public CookieStore setCookieStore(HttpResponse httpResponse) { } 1.4 ⽤httpClient简单封装⼀个httpUtils⼯具类有get.post,put,delete⽅法 1.4.1 httpUtils中post封装⽅法如下: public CloseableHttpResponse post(String url, Map<String, String> params,CloseableHttpClient httpclient,CookieStore cookieStore){ } 2、返回参数 2.1 创建⼀个接⼝返回对象ResponseBean, 对象ResponseBean,包括status、statusCode、contentType、body、url、method、cookies 2.2 在⼯具类中在创建⼀个ReponseUtil⼯具类 ReponseUtil⼯具类负责将请求的返回数据CloseableHttpResponse 转换成ResponseBean public ResponseBean setResponseBean(CloseableHttpResponse httpResponse) { } 3、测试⽤例 测试⽤例管理使⽤了testNg管理,使⽤了TestNG参数化测试,通过xml⽂件来执⾏case 3.1 测试case脚本public class GetRoleTest {static CookieStore cookieStore ;static CookieUtil cookieUtil=new CookieUtil() ;CloseableHttpClient client;HttpUtils httpUtils=HttpUtils.getInstance();@Parameters({ "url", "objBean" ,"statusCode","xmlName"})@BeforeSuite/** 登录进⼊系统获取JSESSIONID放⼊到CookieStore中* */public void TestLoginIn(String url ,String objBean, String statusCode,String xmlName) {Map<String,String> params=xmlUtil.readXMLDocument(objBean,xmlName);client = HttpClients.createDefault();CloseableHttpResponse httpResponse= httpUtils.post(url, params, client, cookieStore);//cookieUtil.printResponse(httpResponse);cookieStore=cookieUtil.setCookieStore(httpResponse);}@Parameters({ "url", "objBean" ,"statusCode","body","xmlName"})@Test(priority = 2)public void TestGetRole(String url ,String objBean, String statusCode,String body,String xmlName) {Map<String,String> params=xmlUtil.readXMLDocument(objBean,xmlName);client = HttpClients.custom().setDefaultCookieStore(cookieStore).build();CloseableHttpResponse httpResponse= httpUtils.post(url, params, client, cookieStore);ResponseBean rb=new ReponseUtil().setResponseBean(httpResponse);// add AssertAssert.assertEquals("OK", rb.getStatus());Assert.assertEquals(statusCode, rb.getStatusCode());Assert.assertEquals(true, rb.getBody().contains(body));}@AfterSuitepublic void closeClient(){try {// 关闭流并释放资源client.close();} catch (IOException e) {e.printStackTrace();}}} [注] 因为API接⼝测试时每次都要校验Cookie,所有我们每次都先执⾏登录操作去获取Cookie 3.2 xml⽂件的编写<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE suite SYSTEM "/testng-1.0.dtd"><suite name="TestGetRole" parallel="classes" thread-count="5"><parameter name="url" value="/sys/login" /><parameter name="objBean" value="loginIn" /><parameter name="status" value="OK" /><parameter name="statusCode" value="200" /><parameter name="xmlName" value="mapRole" /><test name="TestGetRole" preserve-order="true"><parameter name="url" value="/json/getRoleInfo" /><parameter name="objBean" value="GetRole" /><parameter name="status" value="OK" /><parameter name="statusCode" value="200" /><parameter name="body" value="roleName" /><classes><class name="com.lc.testScript.GetRoleTest"><methods><include name="TestGetRole" /><!--<include name="TestGetRole2" />--></methods></class></classes></test></suite> 右键->run as ->TestNG Suite,这个场景的的测试⽤例就可以运⾏了 4、测试报告和项⽬组织 测试报告这⾥⽤到第三⽅的包ReportNG 项⽬组织⽤Maven<project xmlns="/POM/4.0.0" xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/POM/4.0.0 /xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion>..............................................................................................................................<properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><xmlFileName1>TestGetRole.xml</xmlFileName>.................这⾥写testNG对应的XML名称----------------------<xmlFileName10>TestGetUser.xml</xmlFileName></properties><dependencies>..........................</dependencies><build><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><version>2.19</version><configuration><suiteXmlFiles><suiteXmlFile>src/test/java/testSuites/${xmlFileName}</suiteXmlFile>.................略..........................这⾥的和properties中的xmlFileName想对应............<suiteXmlFile>src/test/java/testSuites/${xmlFileName10}</suiteXmlFile></suiteXmlFiles></configuration></plugin><!-- 添加插件,添加ReportNg的监听器,修改最后的TestNg的报告 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><version>2.5</version><configuration><properties><property><name>usedefaultlisteners</name><value>false</value></property><property><name>listener</name><value>org.uncommons.reportng.HTMLReporter</value></property></properties><workingDirectory>target/</workingDirectory></configuration></plugin><plugin><artifactId>maven-compiler-plugin</artifactId><version>3.5.1</version><configuration><source>1.8</source><target>1.8</target></configuration></plugin></plugins></build></project> [注] 因为是maven的项⽬所以要将testSuite的xml⽂件放在maven的test⽬录下,这样右键pom.xml⽂件maven test,所有的测试⽤例就开始执⾏了 测试报告 框架⽬前存在的不⾜ 1、数据校验这⼀块的功能还没有完善,计划⽤MyBatis 2、参数使⽤了xml⽂件配置虽然灵活但有些繁琐,⽬前还没想到好的解决⽅案,testlink是否可以尝试⼀下呢。

前端开发知识:如何使用WebSocket和WebRTC来实现自动化测试

前端开发知识:如何使用WebSocket和WebRTC来实现自动化测试

前端开发知识:如何使用WebSocket和WebRTC来实现自动化测试自动化测试在前端开发领域中扮演着越来越重要的角色。

而在实现自动化测试过程中,WebSocket和WebRTC则是两种非常有用的工具。

本文将重点介绍这两种工具的应用。

WebSocket是HTML5引入的一种新协议,它基于TCP协议,在不断开HTTP请求的情况下,允许服务器向客户端主动发送数据。

这种实时的双向通信方式,非常适合在自动化测试过程中使用,因为开发者可以在测试过程中实时监测数据发送和接收的情况,并进行测试反馈。

在使用WebSocket来实现自动化测试的过程中,我们首先需要建立WebSocket连接。

这可以通过JavaScript中的WebSocket对象来实现,如下所示:```javascriptlet ws = new WebSocket('ws://localhost:8080');```这里的`localhost:8080`是服务器的地址和端口号,开发者需要根据实际情况进行调整。

一旦建立了WebSocket连接,我们可以通过`onopen`事件来发送用于测试的数据,如下所示:```javascriptws.onopen = () => {ws.send('Hello, world!');};```上述代码中,我们使用`send()`方法来向服务器发送消息。

服务器收到消息后,可以根据实际情况对消息进行解析和响应。

在接收到服务器响应后,开发者可以使用`onmessage`事件来处理响应数据,并进行测试结果的分析、反馈和记录,如下所示:```javascriptws.onmessage = (event) => {console.log(event.data);};```在使用WebSocket实现自动化测试的过程中,我们还需要注意另外一点:WebSocket的连接是可以断开的,因此需要在`onclose`事件处理函数中对连接进行处理,如下所示:```javascriptws.onclose = () => {console.log('WebSocket connection closed.');};```除了WebSocket,还有另一种非常适合在自动化测试中使用的工具,那就是WebRTC。

自动化测试框架的构建与实践案例分析

自动化测试框架的构建与实践案例分析

自动化测试框架的构建与实践案例分析在当今的软件开发领域,自动化测试已经成为确保软件质量和提高开发效率的关键手段。

而构建一个高效、稳定且可扩展的自动化测试框架则是实现自动化测试目标的重要基石。

本文将深入探讨自动化测试框架的构建方法,并结合实际案例进行详细分析,希望能为广大软件测试人员和开发团队提供有益的参考。

一、自动化测试框架的概述自动化测试框架是一组用于组织、管理和执行自动化测试用例的工具、技术和规范的集合。

它的主要目的是提高测试效率、降低测试成本、增强测试的可靠性和可维护性。

一个良好的自动化测试框架应该具备以下特点:1、可重用性:测试脚本和测试组件能够在不同的项目和测试场景中重复使用,减少重复开发的工作量。

2、可扩展性:能够方便地添加新的测试用例和测试功能,以适应不断变化的软件需求。

3、稳定性:在不同的环境和条件下,能够稳定地执行测试,确保测试结果的准确性。

4、可读性和可维护性:测试代码结构清晰、易于理解和维护,方便测试人员进行修改和优化。

二、自动化测试框架的构建要素1、测试工具选择选择适合项目需求的自动化测试工具是构建框架的第一步。

常见的自动化测试工具包括 Selenium、Appium、TestNG、JUnit 等。

例如,对于 Web 应用的自动化测试,Selenium 是一个广泛使用的工具;而对于移动应用的自动化测试,Appium 则更为合适。

2、测试框架设计框架的设计应遵循分层架构的原则,将测试代码分为不同的层次,如页面层、业务逻辑层、数据层等。

这样可以使测试代码更加清晰、易于维护,并且提高代码的复用性。

3、测试数据管理有效的测试数据管理是确保测试准确性和覆盖度的关键。

测试数据可以存储在数据库、Excel 文件或其他数据存储介质中,并通过数据驱动的测试方法来实现测试用例与测试数据的分离。

4、测试环境搭建搭建稳定的测试环境,包括硬件环境、操作系统、浏览器、移动设备等,以确保测试的一致性和可靠性。

软件测试中的自动化测试框架设计与实现

软件测试中的自动化测试框架设计与实现

软件测试中的自动化测试框架设计与实现随着软件开发过程的复杂化和软件产品的不断更新迭代,传统的手动测试已经无法满足测试需求的快速环节。

为了提高测试效率和质量,自动化测试成为软件测试领域的重要发展方向。

而自动化测试框架作为实现自动化测试的关键组成部分,在软件测试中扮演着重要的角色。

一、自动化测试框架的概念自动化测试框架是指一套结构化的、可重用的测试工具和组件,用于支持自动化测试的设计、实施和管理。

它提供了一系列的接口和功能,可以帮助测试人员快速、高效地完成测试任务。

自动化测试框架的设计和实现,应该充分考虑测试需求的多样性和软件测试工具的可扩展性,以满足不同领域、不同软件产品的测试需要。

二、自动化测试框架的设计原则1. 可扩展性:自动化测试框架应该具有良好的可扩展性,能够适应不同的测试场景和需求。

它应该能够支持不同的测试工具和组件的集成,如测试驱动开发工具、测试管理工具、应用程序接口(API)等。

2. 可重用性:自动化测试框架应该是可重用的,能够在不同的测试项目中进行复用。

通过将常用的测试模块和组件进行抽象和封装,可以提高测试的效率和质量,并减少测试案例的编写和维护成本。

3. 易用性:自动化测试框架应该是易用的,能够帮助测试人员快速上手。

它应该提供清晰的接口和文档,以及简单的配置和管理功能,使测试人员能够方便地进行测试脚本的编写、执行和结果分析。

4. 可靠性:自动化测试框架的设计和实现应该具有高可靠性,能够在不同的测试环境中稳定运行,并能够有效地捕获和处理测试中的异常情况。

此外,它还应该具备可恢复性,能够在发生错误时恢复到上一次的正确状态。

三、自动化测试框架的实现步骤1. 确定测试目标和需求:在设计自动化测试框架之前,首先需要明确测试的目标和需求。

根据不同的测试需求,确定测试的范围和测试用例的编写方式,以及所需的测试数据和环境。

2. 选择适合的测试工具:根据测试需求,选择适合的自动化测试工具。

常见的测试工具包括Selenium、Appium、JUnit等。

接口自动化测试用例案例

接口自动化测试用例案例

接口自动化测试用例案例接口自动化测试用例是指通过编写脚本来自动执行接口测试的过程。

接口自动化测试用例的目的是验证接口的功能和性能是否符合预期,并提高测试效率和质量。

下面列举了一些接口自动化测试用例的案例,以帮助读者更好地理解接口自动化测试的实施过程。

1. 验证接口的返回状态码:通过发送请求,验证接口的返回状态码是否符合预期。

例如,当发送请求成功时,接口应返回200状态码;当请求的资源不存在时,接口应返回404状态码。

2. 验证接口的返回数据格式:通过发送请求,验证接口的返回数据格式是否符合预期。

例如,接口应返回JSON格式的数据,且数据中的字段和值符合预期。

3. 验证接口的返回数据准确性:通过发送请求,验证接口的返回数据是否准确。

例如,当请求获取用户信息的接口时,接口应返回该用户的正确信息。

4. 验证接口的错误处理能力:通过发送错误的请求,验证接口是否能正确处理错误,并返回相应的错误信息。

例如,当发送无效的请求参数时,接口应返回相应的错误提示信息。

5. 验证接口的并发性能:通过发送大量并发请求,验证接口的并发性能是否符合预期。

例如,接口应能够正确处理并发请求,并在合理的时间内返回响应。

6. 验证接口的安全性:通过发送恶意请求,验证接口的安全性是否得到保障。

例如,接口应对SQL注入、XSS攻击等安全漏洞进行有效防护。

7. 验证接口的稳定性:通过发送大量重复请求,验证接口的稳定性是否得到保障。

例如,接口应能够稳定地处理大量重复请求,并保持正常的响应时间。

8. 验证接口的性能指标:通过发送大量请求,统计接口的响应时间、吞吐量等性能指标,以评估接口的性能是否符合预期。

9. 验证接口的兼容性:通过发送不同版本或不同环境的请求,验证接口在不同环境下的兼容性。

例如,接口应能够正确处理不同版本的请求,并返回相应的兼容结果。

10. 验证接口的回归稳定性:通过发送各种类型的请求,验证接口在多次修改后的稳定性。

例如,接口应能够稳定地处理各种类型的请求,并返回正确的结果。

接口自动化测试框架设计系列(一)

接口自动化测试框架设计系列(一)
接口测试报告:
测试从业两年多以来确实是如此大多数在功能测试之中好多东西得学但是课外学一要有时间二有时候又觉得有点纸上谈兵毕竟当下工作没用上觉得还真的挺难的
接口自动化测试框架设计系列(一)
先来一张接口自动化测试框架的架架结构解析: Config目录:存放配置文件,比如数据库的端口,地址,邮件配置信息等。 Data目录:存放公共部分数据,比如日志,token,excel,业务id等等。 Log目录:存放logging日志信息。 page目录:公共部分方法存放目录。 Reports目录:存放接口测试报告目录。 TestCases目录:存放接口测试案例目录。 Utlis目录:公共配置文件、方法目录。 runMain.py文件:主程序入文件口。

自动化测试平台的设计与实现

自动化测试平台的设计与实现

自动化测试平台的设计与实现引言概述:自动化测试平台是软件开发中必不可少的一环,它能够提高测试效率、减少人力成本,并且能够保证软件质量。

本文将介绍自动化测试平台的设计与实现,包括平台的架构设计、功能模块、测试用例管理、自动化测试执行和结果分析等五个部分。

一、平台的架构设计1.1 硬件设备:自动化测试平台需要选择合适的硬件设备来支持测试环境的搭建,如服务器、虚拟机、测试设备等。

1.2 软件工具:选择适合的软件工具用于平台的开发和测试,如测试管理工具、测试执行工具、测试报告生成工具等。

1.3 网络架构:设计合理的网络架构能够保证测试环境的稳定性和可靠性,包括网络拓扑、网络带宽、网络安全等。

二、功能模块2.1 用户管理:实现用户的注册、登录、权限管理等功能,确保不同用户有不同的操作权限。

2.2 项目管理:提供项目的创建、编辑、删除等功能,方便测试人员进行项目管理和测试用例的管理。

2.3 测试环境管理:实现测试环境的搭建、配置和管理,包括虚拟机的创建、网络的配置、测试设备的管理等。

三、测试用例管理3.1 用例编写:提供用例编写的界面,支持多种编程语言和测试框架,方便测试人员编写测试用例。

3.2 用例管理:实现用例的创建、编辑、删除等功能,支持用例的分类、标签等方式进行管理。

3.3 用例执行:提供用例执行的功能,支持批量执行、定时执行等方式,自动记录执行结果和日志。

四、自动化测试执行4.1 测试任务调度:实现测试任务的调度和分配,根据测试需求和资源情况进行任务的分配和执行。

4.2 测试执行监控:实时监控测试任务的执行情况,包括任务的进度、执行结果等信息。

4.3 异常处理:对于执行过程中出现的异常情况,能够及时处理和记录,方便后续的问题分析和修复。

五、结果分析5.1 测试报告生成:根据测试执行的结果生成测试报告,包括测试覆盖率、错误率、性能指标等信息。

5.2 数据分析:对测试结果进行数据分析,找出测试中的瓶颈和问题,并提供优化建议。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

http接口自动化测试框架实现作者:张元礼/vincetest一、测试需求描述对服务后台一系列的http接口功能测试。

输入:根据接口描述构造不同的参数输入值输出:XML文件eg:/xxx_product/test/content_book_list.jsp? listid=1二、实现方法1、选用Python脚本来驱动测试2、采用Excel表格管理测试数据,包括用例的管理、测试数据录入、测试结果显示等等,这个需要封装一个Excel的类即可。

3、调用http接口采用Python封装好的API即可4、测试需要的http组装字符转处理即可5、设置2个检查点,XML文件中的返回值字段(通过解析XML得到);XML文件的正确性(文件对比)6、首次执行测试采用半自动化的方式,即人工检查输出的XML文件是否正确,一旦正确将封存XML文件,为后续回归测试的预期结果,如果发现错误手工修正为预期文件。

(注意不是每次测试都人工检查该文件,只首次测试的时候才检查)三、Excel表格样式四、实现代码(代码才是王道,有注释很容易就能看明白的)1、测试框架代码[python]view plaincopy1.#****************************************************************2.# TestFrame.py3.# Author : Vince4.# Version : 1.1.25.# Date : 2011-3-146.# Description: 自动化测试平台7.#****************************************************************8.9.import os,sys, urllib, httplib, profile, datetime, time10.from xml2dict import XML2Dict11.import win32com.client12.from win32com.client import Dispatch13.import xml.etree.ElementTree as et14.#import MySQLdb15.16.#Excel表格中测试结果底色17.OK_COLOR=0xffffff18.NG_COLOR=0xff19.#NT_COLOR=0xffff20.NT_COLOR=0xC0C0C021.22.#Excel表格中测试结果汇总显示位置23.TESTTIME=[1, 14]24.TESTRESULT=[2, 14]25.26.#Excel模版设置27.#self.titleindex=3 #Excel中测试用例标题行索引28.#self.casebegin =4 #Excel中测试用例开始行索引29.#self.argbegin =3 #Excel中参数开始列索引30.#self.argcount =8 #Excel中支持的参数个数31.class create_excel:32.def __init__(self, sFile, dtitleindex=3, dcasebegin=4, dargbegin=3, dargcount=8):33. self.xlApp = win32com.client.Dispatch('et.Application') #MS:ExcelWPS:et34.try:35. self.book = self.xlApp.Workbooks.Open(sFile)36.except:37. print_error_info()38.print"打开文件失败"39. exit()40. self.file=sFile41. self.titleindex=dtitleindex42. self.casebegin=dcasebegin43. self.argbegin=dargbegin44. self.argcount=dargcount45. self.allresult=[]46.47. self.retCol=self.argbegin+self.argcount48. self.xmlCol=self.retCol+149. self.resultCol=self.xmlCol+150.51.def close(self):52.#self.book.Close(SaveChanges=0)53. self.book.Save()54. self.book.Close()55.#self.xlApp.Quit()56.del self.xlApp57.58.def read_data(self, iSheet, iRow, iCol):59.try:60. sht = self.book.Worksheets(iSheet)61. sValue=str(sht.Cells(iRow, iCol).Value)62.except:63. self.close()64.print('读取数据失败')65. exit()66.#去除'.0'67.if sValue[-2:]=='.0':68. sValue = sValue[0:-2]69.return sValue70.71.def write_data(self, iSheet, iRow, iCol, sData, color=OK_COLOR):72.try:73. sht = self.book.Worksheets(iSheet)74. sht.Cells(iRow, iCol).Value = sData.decode("utf-8")75. sht.Cells(iRow, iCol).Interior.Color=color76. self.book.Save()77.except:78. self.close()79.print('写入数据失败')80. exit()81.82.#获取用例个数83.def get_ncase(self, iSheet):84.try:85.return self.get_nrows(iSheet)-self.casebegin+186.except:87. self.close()88.print('获取Case个数失败')89. exit()90.91.def get_nrows(self, iSheet):92.try:93. sht = self.book.Worksheets(iSheet)94.return edRange.Rows.Count95.except:96. self.close()97.print('获取nrows失败')98. exit()99.100.def get_ncols(self, iSheet):101.try:102. sht = self.book.Worksheets(iSheet)103.return edRange.Columns.Count104.except:105. self.close()106.print('获取ncols失败')107. exit()108.109.def del_testrecord(self, suiteid):110.try:111.#为提升性能特别从For循环提取出来112. nrows=self.get_nrows(suiteid)+1113. ncols=self.get_ncols(suiteid)+1114. begincol=self.argbegin+self.argcount115.116.#提升性能117. sht = self.book.Worksheets(suiteid)118.119.for row in range(self.casebegin, nrows):120.for col in range(begincol, ncols):121. str=self.read_data(suiteid, row, col)122.#清除实际结果[]123. startpos = str.find('[')124.if startpos>0:125. str = str[0:startpos].strip()126. self.write_data(suiteid, row, col, str, OK_COLOR) 127.else:128.#提升性能129. sht.Cells(row, col).Interior.Color = OK_COLOR 130.#清除TestResul列中的测试结果,设置为NT131. self.write_data(suiteid, row, self.argbegin+self.argcount+ 1, ' ', OK_COLOR)132. self.write_data(suiteid, row, self.resultCol, 'NT', NT_COLO R)133.except:134. self.close()135.print('清除数据失败')136. exit()137.138.#执行调用139.def HTTPInvoke(IPPort, url):140. conn = httplib.HTTPConnection(IPPort)141. conn.request("GET", url)142. rsps = conn.getresponse()143. data = rsps.read()144. conn.close()145.return data146.147.#获取用例基本信息[Interface,argcount,[ArgNameList]]148.def get_caseinfo(Data, SuiteID):149. caseinfolist=[]150. sInterface=Data.read_data(SuiteID, 1, 2)151. argcount=int(Data.read_data(SuiteID, 2, 2))152.153.#获取参数名存入ArgNameList154. ArgNameList=[]155.for i in range(0, argcount):156. ArgNameList.append(Data.read_data(SuiteID, Data.titleindex, Data.ar gbegin+i))157.158. caseinfolist.append(sInterface)159. caseinfolist.append(argcount)160. caseinfolist.append(ArgNameList)161.return caseinfolist162.163.#获取输入164.def get_input(Data, SuiteID, CaseID, caseinfolist):165. sArge=''166.#参数组合167.for j in range(0, caseinfolist[1]):168.if Data.read_data(SuiteID, Data.casebegin+CaseID, Data.argbegin+j) != "None":169. sArge=sArge+caseinfolist[2][j]+'='+Data.read_data(SuiteID, Data .casebegin+CaseID, Data.argbegin+j)+'&'170.171.#去掉结尾的&字符172.if sArge[-1:]=='&':173. sArge = sArge[0:-1]174. sInput=caseinfolist[0]+sArge #组合全部参数175.return sInput176.177.#结果判断178.def assert_result(sReal, sExpect):179. sReal=str(sReal)180. sExpect=str(sExpect)181.if sReal==sExpect:182.return'OK'183.else:184.return'NG'185.186.#将测试结果写入文件187.def write_result(Data, SuiteId, CaseId, resultcol, *result):188.if len(result)>1:189. ret='OK'190.for i in range(0, len(result)):191.if result[i]=='NG':192. ret='NG'193.break194.if ret=='NG':195. Data.write_data(SuiteId, Data.casebegin+CaseId, resultcol,ret, NG_COLOR)196.else:197. Data.write_data(SuiteId, Data.casebegin+CaseId, resultcol,ret, OK_COLOR)198. Data.allresult.append(ret)199.else:200.if result[0]=='NG':201. Data.write_data(SuiteId, Data.casebegin+CaseId, resultcol,resul t[0], NG_COLOR)202.elif result[0]=='OK':203. Data.write_data(SuiteId, Data.casebegin+CaseId, resultcol,resul t[0], OK_COLOR)204.else: #NT205. Data.write_data(SuiteId, Data.casebegin+CaseId, resultcol,resul t[0], NT_COLOR)206. Data.allresult.append(result[0])207.208.#将当前结果立即打印209.print'case'+str(CaseId+1)+':', Data.allresult[-1]210.211.#打印测试结果212.def statisticresult(excelobj):213. allresultlist=excelobj.allresult214. count=[0, 0, 0]215.for i in range(0, len(allresultlist)):216.#print 'case'+str(i+1)+':', allresultlist[i]217. count=countflag(allresultlist[i],count[0], count[1], count[2]) 218.print'Statistic result as follow:'219.print'OK:', count[0]220.print'NG:', count[1]221.print'NT:', count[2]222.223.#解析XmlString返回Dict224.def get_xmlstring_dict(xml_string):225. xml = XML2Dict()226.return xml.fromstring(xml_string)227.228.#解析XmlFile返回Dict229.def get_xmlfile_dict(xml_file):230. xml = XML2Dict()231.return xml.parse(xml_file)232.233.#去除历史数据expect[real]234.def delcomment(excelobj, suiteid, iRow, iCol, str):235. startpos = str.find('[')236.if startpos>0:237. str = str[0:startpos].strip()238. excelobj.write_data(suiteid, iRow, iCol, str, OK_COLOR)239.return str240.241.#检查每个item (非结构体)242.def check_item(excelobj, suiteid, caseid,real_dict, checklist, begincol): 243. ret='OK'244.for checkid in range(0, len(checklist)):245. real=real_dict[checklist[checkid]]['value']246. expect=excelobj.read_data(suiteid, excelobj.casebegin+caseid, begin col+checkid)247.248.#如果检查不一致测将实际结果写入expect字段,格式:expect[real]249.#将return NG250. result=assert_result(real, expect)251.if result=='NG':252. writestr=expect+'['+real+']'253. excelobj.write_data(suiteid, excelobj.casebegin+caseid, beginco l+checkid, writestr, NG_COLOR)254. ret='NG'255.return ret256.257.#检查结构体类型258.def check_struct_item(excelobj, suiteid, caseid,real_struct_dict, structlis t, structbegin, structcount):259. ret='OK'260.if structcount>1: #传入的是List261.for structid in range(0, structcount):262. structdict=real_struct_dict[structid]263. temp=check_item(excelobj, suiteid, caseid,structdict, structlis t, structbegin+structid*len(structlist))264.if temp=='NG':265. ret='NG'266.267.else: #传入的是Dict268. temp=check_item(excelobj, suiteid, caseid,real_struct_dict, structl ist, structbegin)269.if temp=='NG':270. ret='NG'271.272.return ret273.274.#获取异常函数及行号275.def print_error_info():276."""Return the frame object for the caller's stack frame."""277.try:278.raise Exception279.except:280. f = sys.exc_info()[2].tb_frame.f_back281.print (f.f_code.co_name, f.f_lineno)282.283.#测试结果计数器,类似Switch语句实现284.def countflag(flag,ok, ng, nt):285. calculation = {'OK':lambda:[ok+1, ng, nt],286.'NG':lambda:[ok, ng+1, nt],287.'NT':lambda:[ok, ng, nt+1]}288.return calculation[flag]()2、项目测试代码[python]view plaincopy1.# -*- coding: utf-8 -*-2.#****************************************************************3.# xxx_server_case.py4.# Author : Vince5.# Version : 1.06.# Date : 2011-3-107.# Description: 内容服务系统测试代码8.#****************************************************************9.10.from testframe import *11.from common_lib import *12.13.httpString='/xxx_product/test/'14.expectXmldir=os.getcwd()+'/TestDir/expect/'15.realXmldir=os.getcwd()+'/TestDir/real/'16.17.def run(interface_name, suiteid):18.print'【'+interface_name+'】' + ' Test Begin,please waiting...'19.global expectXmldir, realXmldir20.21.#根据接口名分别创建预期结果目录和实际结果目录22. expectDir=expectXmldir+interface_name23. realDir=realXmldir+interface_name24.if os.path.exists(expectDir) == 0:25. os.makedirs(expectDir)26.if os.path.exists(realDir) == 0:27. os.makedirs(realDir)28.29. excelobj.del_testrecord(suiteid) #清除历史测试数据30. casecount=excelobj.get_ncase(suiteid) #获取case个数31. caseinfolist=get_caseinfo(excelobj, suiteid) #获取Case基本信息32.33.#遍历执行case34.for caseid in range(0, casecount):35.#检查是否执行该Case36.if excelobj.read_data(suiteid,excelobj.casebegin+caseid, 2)=='N':37. write_result(excelobj, suiteid, caseid, excelobj.resultCol, 'NT')38.continue#当前Case结束,继续执行下一个Case39.40.#获取测试数据41. sInput=httpString+get_input(excelobj, suiteid, caseid, caseinfolist)42. XmlString=HTTPInvoke(com_ipport, sInput) #执行调用43.44.#获取返回码并比较45. result_code=et.fromstring(XmlString).find("result_code").text46. ret1=check_result(excelobj, suiteid, caseid,result_code, excelobj.retCol)47.48.#保存预期结果文件49. expectPath=expectDir+'/'+str(caseid+1)+'.xml'50.#saveXmlfile(expectPath, XmlString)51.52.#保存实际结果文件53. realPath=realDir+'/'+str(caseid+1)+'.xml'54. saveXmlfile(realPath, XmlString)55.56.#比较预期结果和实际结果57. ret2= check_xmlfile(excelobj, suiteid, caseid,expectPath, realPath)58.59.#写测试结果60. write_result(excelobj, suiteid, caseid, excelobj.resultCol, ret1, ret2)61.print'【'+interface_name+'】' + ' Test End!'3、测试入口[python]view plaincopy1.# -*- coding: utf-8 -*-2.#****************************************************************3.# main.py4.# Author : Vince5.# Version : 1.06.# Date : 2011-3-167.# Description: 测试组装,用例执行入口8.#****************************************************************9.10.from testframe import *11.from xxx_server_case import *12.import xxx_server_case13.14.#产品系统接口测试15.#设置测试环境16.xxx_server_case.excelobj=create_excel(os.getcwd()+'/TestDir/xxx_Testcase.xls')17.xxx_server__ipport='18.19.#Add testsuite begin20.run("xxx_book_list", 4)21.#Add other suite from here22.#Add testsuite end23.24.statisticresult(xxx_server_case.excelobj)25.xxx_server_case.excelobj.close()最后感谢我的同事Roger为此做了一些优化,后续优化的东东还很多,我们一直在努力!欢迎转载此文,转载时请注明文章来源:张元礼的博客/vincetest。

相关文档
最新文档