接口测试——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 }
View Code

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 }
View Code

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 }
View Code

测试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 }
View Code

报表文件示例

报表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>
View Code

这里需要注意的是,由于接口返回的是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>
View Code

问题总结

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

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

posted @ 2018-01-21 17:11  温一壶清酒  阅读(1897)  评论(0编辑  收藏  举报