接口测试——Java + TestNG 国家气象局接口(json解析)实例


后端测试,主要以测试接口为主。需要代码支撑,近期便找了个天气接口捣鼓了。

使用到的工具是: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("

请求地址: "+weather.geturl()+"

"); 64 Reporter.log("【返回结果】: "+httpResult); 65 weatherinfo=Common.getJsonValue(httpResult, "weatherinfo"); 66 city=Common.getJsonValue(weatherinfo, "city"); 67 Reporter.log("

【用例结果】: resultCode=>expected: " + expect_city + " ,actual: "+ city+"

"); 68 Assert.assertEquals(city,expect_city); 69 Reporter.log("

"); 70 Reporter.log("

"+"------------------------------------------------------------------------------"+"

"); 71 } 72 }

报表文件示例

报表html文件位置在如下所示:

代码实现如上就完成,需要配置pom.xml文件和testng.xml文件,可参照如下:

pom.xml

pom.xml文件是下载依赖包的,特别方便

 1  2   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 3   4.0.0
 4 
 5   com
 6   CityWether
 7   0.0.1-SNAPSHOT
 8   jar
 9 
10   CityWether
11   http://maven.apache.org
12 
13   
14     UTF-8
15   
16 
17   
18     
19       junit
20       junit
21       3.8.1
22       test
23     
24     
25         org.json
26         json
27         20171018
28     
29     
30         org.testng
31            testng
32         6.9.10
33   
34   
35     org.uncommons
36     reportng
37     1.1.4
38  
39  
40     com.google.inject
41     guice
42     4.0
43  
44  
45     velocity
46     velocity-dep
47     1.4
48  
49   
50 

这里需要注意的是,由于接口返回的是json数据,所以必须导入json依赖包:

1 
2    org.json
3    json
4    20171018
5 

testng.xml

testng.xml文件是用于运行的,运行程序直接运行该文件即可:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 
 3 
 4     
 5         
 6             <class name="com.CityWether.CityInfo.TestCase" />
 7         
 8     
 9     
10       class-name="org.uncommons.reportng.HTMLReporter" /> 
11       class-name="org.uncommons.reportng.JUnitXMLReporter" />
12     
13 

问题总结

自己在完成过程中,过程中遇到如下问题:

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包的,切莫忘记