• 接口测试——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包的,切莫忘记

  • 相关阅读:
    骨骼动画的原理及在Unity中的使用
    GUI之ScrollView的使用
    Java编程技术之浅析Java容器技术
    Linux系统 Centos7 环境基于Docker部署Rocketmq服务
    Linux系统环境基于Docker搭建Mysql数据库服务实战
    Java编程技术之浅析JVM内存
    Java编程技术之浅析SPI服务发现机制
    Linux系统环境基于Docker搭建系统基础镜像
    Linux Centos7 环境搭建Docker部署Zookeeper分布式集群服务实战
    Linux Centos7 环境基于Docker部署Zookeeper服务搭建实战
  • 原文地址:https://www.cnblogs.com/hong-fithing/p/8324800.html
Copyright © 2020-2023  润新知