后端测试,主要以测试接口为主。需要代码支撑,近期便找了个天气接口捣鼓了。
使用到的工具是:Eclipse + TestNG + Maven + ReportNG,全国城市编码:http://www.cnblogs.com/oucbl/p/6138963.html,接口地址:http://www.weather.com.cn/data/cityinfo/城市编码.html
先看一下代码架构,如下所示:
建的是maven工程,个人觉得这样下载依赖包较方便。工程科分为四部分:功能代码,测试case,报表文件和配置文件。网络上也有很多这样的实例,我只是列举些我在做的过程中所遇到的问题吧,也当一个记录。maven不会配置,可参见我之前写的随笔。
功能代码
Common
1 package com.CityWether.CityInfo; 2 3 import net.sf.json.JSONException; 4 import net.sf.json.JSONObject; 5 6 public class Common { 7 public static String getJsonValue(String JsonString, String JsonId) { 8 String JsonValue = ""; 9 //trim()去掉字符串首尾的空格 10 if (JsonString == null || JsonString.trim().length() < 1) { 11 return null; 12 } 13 try { 14 JSONObject obj1 = new JSONObject(JsonString); 15 JsonValue = obj1.getString(JsonId); 16 } catch (JSONException e) { 17 e.printStackTrace(); 18 } 19 return JsonValue; 20 } 21 }
URLConnection
1 package com.CityWether.CityInfo; 2 3 import java.net.HttpURLConnection; 4 import java.net.URL; 5 6 public class URLConnection { 7 public static HttpURLConnection getConnection(String url){ 8 HttpURLConnection connection = null; 9 try { 10 // 打开和URL之间的连接 11 URL postUrl = new URL(url); 12 connection = (HttpURLConnection) postUrl.openConnection(); 13 // 设置通用的请求属性 14 connection.setDoOutput(true); 15 connection.setDoInput(true); 16 connection.setRequestMethod("GET"); 17 connection.setUseCaches(false); 18 connection.setInstanceFollowRedirects(true); 19 connection.setRequestProperty("Content-Type", "application/json"); 20 connection.setRequestProperty("Charset", "utf-8"); 21 connection.setRequestProperty("Accept-Charset", "utf-8"); 22 } catch (Exception e) { 23 e.printStackTrace(); 24 } 25 return connection; 26 } 27 }
CityWeather
1 package com.CityWether.CityInfo; 2 3 import java.io.BufferedReader; 4 import java.io.DataOutputStream; 5 import java.io.IOException; 6 import java.io.InputStreamReader; 7 import java.net.HttpURLConnection; 8 9 public class CityWeather { 10 private String url=""; 11 12 public String geturl() { 13 return url; 14 } 15 16 public static String formatString(String s) { 17 if (s != null) { 18 s = s.replaceAll("\ufeff", ""); 19 } 20 return s; 21 } 22 23 public String getHttpRespone(String cityCode) throws IOException { 24 String line = ""; 25 String httpResults = ""; 26 url=("http://www.weather.com.cn/data/cityinfo/" + cityCode + ".html"); 27 try { 28 HttpURLConnection connection = URLConnection.getConnection(url); 29 // 建立实际的连接 30 connection.connect(); 31 BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); 32 while ((line = reader.readLine()) != null) { 33 httpResults = httpResults + line.toString(); 34 } 35 reader.close(); 36 // 断开连接 37 connection.disconnect(); 38 } catch (Exception e) { 39 e.printStackTrace(); 40 } 41 return httpResults; 42 } 43 }
测试case
1 package com.CityWether.CityInfo; 2 3 import java.io.IOException; 4 5 import org.testng.Assert; 6 import org.testng.Reporter; 7 import org.testng.annotations.Test; 8 9 import com.CityWether.CityInfo.CityWeather; 10 import com.CityWether.CityInfo.Common; 11 12 public class TestCase { 13 public String httpResult= null, weatherinfo= null, city=null,expect_city = null; 14 public static String cityCode=""; 15 CityWeather weather=new CityWeather(); 16 17 @Test(priority=0) 18 public void getHuaihua() throws IOException{ 19 expect_city="怀化"; 20 cityCode="101251201"; 21 resultCheck(cityCode, expect_city); 22 } 23 24 @Test(priority=1) 25 public void getHuitong() throws IOException{ 26 expect_city="会同"; 27 cityCode="101251206"; 28 resultCheck(cityCode, expect_city); 29 } 30 31 @Test(priority=2) 32 public void getChangsha() throws IOException{ 33 expect_city="长沙"; 34 cityCode="101250101"; 35 resultCheck(cityCode, expect_city); 36 } 37 38 @Test(priority=3) 39 public void getBaoshan() throws IOException{ 40 expect_city="宝山"; 41 cityCode="101020300"; 42 resultCheck(cityCode, expect_city); 43 } 44 45 @Test(priority=4) 46 public void getShanghai() throws IOException{ 47 expect_city="上海"; 48 cityCode="101020100"; 49 resultCheck(cityCode, expect_city); 50 } 51 52 @Test(priority=5) 53 public void Minhang() throws IOException{ 54 expect_city="闵行"; 55 cityCode="101020200"; 56 resultCheck(cityCode, expect_city); 57 } 58 59 public void resultCheck(String cityCode, String expect_city) throws IOException{ 60 System.setProperty("org.uncommons.reportng.escape-output", "false"); 61 Reporter.log("【正常用例】:获取"+expect_city+"天气成功!"); 62 httpResult=weather.getHttpRespone(cityCode); 63 Reporter.log("<p><span style=\"color:#FF0000\">请求地址: "+weather.geturl()+"</span></p>"); 64 Reporter.log("【返回结果】: "+httpResult); 65 weatherinfo=Common.getJsonValue(httpResult, "weatherinfo"); 66 city=Common.getJsonValue(weatherinfo, "city"); 67 Reporter.log("<p>【用例结果】: resultCode=>expected: " + expect_city + " ,actual: "+ city+"</p>"); 68 Assert.assertEquals(city,expect_city); 69 Reporter.log("<p></p>"); 70 Reporter.log("<p>"+"------------------------------------------------------------------------------"+"</p>"); 71 } 72 }
报表文件示例
报表html文件位置在如下所示:
代码实现如上就完成,需要配置pom.xml文件和testng.xml文件,可参照如下:
pom.xml
pom.xml文件是下载依赖包的,特别方便
1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 2 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 3 <modelVersion>4.0.0</modelVersion> 4 5 <groupId>com</groupId> 6 <artifactId>CityWether</artifactId> 7 <version>0.0.1-SNAPSHOT</version> 8 <packaging>jar</packaging> 9 10 <name>CityWether</name> 11 <url>http://maven.apache.org</url> 12 13 <properties> 14 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 15 </properties> 16 17 <dependencies> 18 <dependency> 19 <groupId>junit</groupId> 20 <artifactId>junit</artifactId> 21 <version>3.8.1</version> 22 <scope>test</scope> 23 </dependency> 24 <dependency> 25 <groupId>org.json</groupId> 26 <artifactId>json</artifactId> 27 <version>20171018</version> 28 </dependency> 29 <dependency> 30 <groupId>org.testng</groupId> 31 <artifactId>testng</artifactId> 32 <version>6.9.10</version> 33 </dependency> 34 <dependency> 35 <groupId>org.uncommons</groupId> 36 <artifactId>reportng</artifactId> 37 <version>1.1.4</version> 38 </dependency> 39 <dependency> 40 <groupId>com.google.inject</groupId> 41 <artifactId>guice</artifactId> 42 <version>4.0</version> 43 </dependency> 44 <dependency> 45 <groupId>velocity</groupId> 46 <artifactId>velocity-dep</artifactId> 47 <version>1.4</version> 48 </dependency> 49 </dependencies> 50 </project>
这里需要注意的是,由于接口返回的是json数据,所以必须导入json依赖包:
1 <dependency> 2 <groupId>org.json</groupId> 3 <artifactId>json</artifactId> 4 <version>20171018</version> 5 </dependency>
testng.xml
testng.xml文件是用于运行的,运行程序直接运行该文件即可:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE suite SYSTEM "http://beust.com/testng/testng-1.0.dtd" > 3 <suite name="suite1"> 4 <test name="test1"> 5 <classes> 6 <class name="com.CityWether.CityInfo.TestCase" /> 7 </classes> 8 </test> 9 <listeners> 10 <listener class-name="org.uncommons.reportng.HTMLReporter" /> 11 <listener class-name="org.uncommons.reportng.JUnitXMLReporter" /> 12 </listeners> 13 </suite>
问题总结
自己在完成过程中,过程中遇到如下问题:
1、接口返回的数据是乱码
如下所示:
经百度科普,是因为BOM报头报错,可参见该博文:http://blog.csdn.net/u012519664/article/details/41596857?%3E,里面有详细介绍。
解决办法:
在CityWeather类中代码下加上如下代码即可:
public static String formatString(String s) { if (s != null) { s = s.replaceAll("\ufeff", ""); } return s; }
2、Common类中导包错误
Common类中代码导入如下包,运行程序报错
import org.json.JSONException; import org.json.JSONObject;
报错为:
解决办法为:
重新导入JSON包即可,如下:
import net.sf.json.JSONException; import net.sf.json.JSONObject;
3、注意:测试报告美化是依赖ReportNG包的,切莫忘记
本文仅代表作者观点,系作者@温一壶清酒发表。
欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
文章出处:http://www.cnblogs.com/hong-fithing/