zoukankan      html  css  js  c++  java
  • httpclient+maven+excel+testng 框架实例----01

    DataProvideTool类:利用testng@DataProvider的注解功能获取数据源,通过为注解命名来区分不同的数据源,详见下面代码:

    package loginjdtest;

    import org.testng.annotations.DataProvider;
    import utl.ExcelReader;

    /**
    * Created by jiangcui on 2018/5/25.
    */
    public class DataProvideTool {

    @DataProvider(name = "LoginData")
    public Object[][] login() {
    System.out.println("开始测试");
    // 测试数据准备
    String file = "C:\Users\jiangcui\IdeaProjects\httpclient\src\main\TestData\LoginTest.xlsx";
    //String file = "." + File.separator + "TestData" + File.separator + "LoginTest.xlsx";
    Object[][] records ;
    records = ExcelReader.getExpectationData(file, "login");
    return records ;
    }


    @DataProvider(name = "data1")
    public Object[][] createdata() {
    return new Object[][] {
    {"lilei", 20, "football"},
    {"hanmeimei", 18, "music"},
    {"wangnima", 25, "baozoumanhua"}
    };
    }
    }

    FirstTest类:具体实现类,httpclient具体应用,详见下方代码:

    package loginjdtest;

    import org.apache.http.HttpEntity;
    import org.apache.http.HttpResponse;
    import org.apache.http.NameValuePair;
    import org.apache.http.ParseException;
    import org.apache.http.client.ClientProtocolException;
    import org.apache.http.client.config.RequestConfig;
    import org.apache.http.client.entity.UrlEncodedFormEntity;
    import org.apache.http.client.methods.HttpPost;
    import org.apache.http.impl.client.CloseableHttpClient;
    import org.apache.http.impl.client.HttpClients;

    import org.apache.http.message.BasicNameValuePair;
    import org.apache.http.util.EntityUtils;
    import org.json.JSONObject;
    import org.testng.Assert;
    import org.testng.annotations.DataProvider;
    import org.testng.annotations.Test;
    import utl.ExcelReader;
    import utl.JsonFormatTool;

    import java.io.File;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.List;



    /**
    * Created by jiangcui on 2018/5/24.
    */
    public class FirstTest {

    private CloseableHttpClient closeableHttpClient = HttpClients.createDefault();
    private HttpPost httpPost;
    private HttpResponse httpResponse;
    private HttpEntity httpEntity;
    private String postResult = "";


    @Test(dataProvider = "LoginData",dataProviderClass = DataProvideTool.class)
    public void loginJDTest(String CaseDescription
    ,String loginUrl,String uuid,String eid,String fp,String _t,String loginType,String loginname,
    String nloginpwd,String authcode,String pubKey,String sa_token)
    {
    System.out.println(loginname +"------"+ uuid +"------" +eid);

    //配置超时时间
    /*RequestConfig requestConfig = RequestConfig.custom()
    .setConnectTimeout(5000)
    .setConnectionRequestTimeout(5000)
    .setSocketTimeout(5000)
    .setRedirectsEnabled(true)
    .build();*/

    //String loginUrl = "https://passport.jd.com/uc/loginService?uuid=c88ccf63-be69-46e3-b803-e19502401d17&ReturnUrl=https%3A%2F%2Fwww.jd.com%2F%3Fcu%3Dtrue%26utm_source%3Dbaidu-pinzhuan%26utm_medium%3Dcpc%26utm_campaign%3Dt_288551095_baidupinzhuan%26utm_term%3D0f3d30c8dba7459bb52f2eb5eba8ac7d_0_a2d6f99128474550bf46e59a0379a5fa&r=0.8389904492228604&version=2015";

    httpPost = new HttpPost(loginUrl);

    //设置超时时间
    // httpPost.setConfig(requestConfig);

    //创建post参数
    List<NameValuePair> list = new ArrayList<NameValuePair>();
    list.add(new BasicNameValuePair("uuid",uuid));
    list.add(new BasicNameValuePair("eid",eid));
    list.add(new BasicNameValuePair("fp",fp));
    list.add(new BasicNameValuePair("_t",_t));
    list.add(new BasicNameValuePair("loginType",loginType));
    list.add(new BasicNameValuePair("loginname",loginname));
    list.add(new BasicNameValuePair("nloginpwd",nloginpwd));
    list.add(new BasicNameValuePair("authcode",authcode));
    list.add(new BasicNameValuePair("pubKey",pubKey));
    list.add(new BasicNameValuePair("sa_token",sa_token));

    try{
    UrlEncodedFormEntity urlEncodedFormEntity = new UrlEncodedFormEntity(list,"utf-8");
    httpPost.setEntity(urlEncodedFormEntity);

    //执行post方法
    httpResponse = closeableHttpClient.execute(httpPost);
    if(null!=httpResponse && !"".equals(httpResponse)){
    if(httpResponse.getStatusLine().getStatusCode() == 200){
    postResult= EntityUtils.toString(httpResponse.getEntity(),"utf-8");
    //System.out.println("查看登录接口请求返回的结果:"+postResult);
    if (postResult.startsWith("(")){
    postResult = postResult.substring(1,postResult.length());
    }
    if(postResult.endsWith(")")){
    postResult = postResult.substring(0,postResult.length()-1);
    }
    //将String 转换为json格式
    JSONObject jsonObject = new JSONObject(postResult);//该结果可用来提取任何想要的值
    // System.out.println(jsonObject.get("username"));
    // Assert.assertEquals(jsonObject.get("eid"),"eid"); assert验证结果
    JsonFormatTool jsonFormatTool = new JsonFormatTool();
    String Result = jsonFormatTool.formatJson(jsonObject.toString());
    System.out.println("请求返回的结果是:"+Result);
    }

    }else{
    System.out.println("null");}


    }catch (Exception e) {
    e.printStackTrace();
    }


    /*catch (ClientProtocolException e) {
    e.printStackTrace();
    } catch (ParseException e) {
    e.printStackTrace();
    } catch (IOException e) {
    e.printStackTrace();
    } finally {
    try {
    if (closeableHttpClient != null) {
    closeableHttpClient.close();
    }
    } catch (IOException e) {
    e.printStackTrace();
    }

    }*/
    httpPost.releaseConnection();
    }

    @Test(dataProvider = "LoginData",dataProviderClass = DataProvideTool.class)
    public void dayin(String CaseDescription
    ,String loginUrl,String uuid,String eid,String fp,String _t,String loginType,String loginname,
    String nloginpwd,String authcode,String pubKey,String sa_token)
    {
    System.out.println(loginname +"------"+ uuid +"------" +eid);
    }

    @Test(dataProvider= "data1",dataProviderClass = DataProvideTool.class)
    public void test2(String name, int age, String hobby) {
    System.out.println(name + " is " + age + " years old and likes " + hobby);
    }



    }



    utl包下面的工具类:ExcelReader类,读取excel数据并对读取的各个单元格格式进行判断和转换

    package utl;

    import org.apache.poi.xssf.usermodel.XSSFCell;
    import org.apache.poi.xssf.usermodel.XSSFRow;
    import org.apache.poi.xssf.usermodel.XSSFSheet;
    import org.apache.poi.xssf.usermodel.XSSFWorkbook;
    import org.apache.poi.poifs.filesystem.POIFSFileSystem;

    import java.io.File;
    import java.io.FileInputStream;
    import java.text.DecimalFormat;
    import java.util.ArrayList;
    import java.util.List;
    /**
    * Created by jiangcui on 2018/5/24.
    */
    public class ExcelReader {
    /**
    * 读取excel文件,excel中不含合并单元格
    * @param path
    * @param sheetname
    * excel表格要注意每行的最后一格不能为空
    * 如果要为空,则需要手动随便填写字符,然后再按del键删除才可以
    * 目前没找到这个解决办法,后续会继续查找解决办法
    * @return
    */
    public static String[][] getExpectationData(String path,String sheetname){
    try{
    File file = new File(path);
    FileInputStream fis = new FileInputStream(file);
    // System.out.println("创建工作表对象");
    //POIFSFileSystem poifsFileSystem = new POIFSFileSystem(fis);
    XSSFWorkbook workBook = new XSSFWorkbook(fis);
    //System.out.println("创建工作表对象01");
    //得到工作表
    XSSFSheet sheet1 = workBook.getSheet(sheetname);
    //得到总行数
    int rowNum = sheet1.getLastRowNum();
    List<String[]> results = new ArrayList<String[]>();
    for (int i=1;i<=rowNum;i++){
    //当前行
    XSSFRow row = sheet1.getRow(i);
    int colNum = row.getLastCellNum();
    String[] data = new String[colNum];
    //当前行所有列
    for (int j = 0; j < colNum; j++) {
    try {
    data[j] = getCellValue(row.getCell(j));
    }catch (NullPointerException e){ //如果单元格为空的时候,则用这个来处理
    data[j] = "";
    }
    }
    //把data[]数组的数据存在list<[]>中
    results.add(data);
    // for(String[] str:results){
    // for(int n =0;n<str.length;n++){
    // System.out.println(str[n]);
    // }
    // }
    }
    fis.close();


    //将列表转化为二维数组
    String[][] returnArray = new String[results.size()][];
    for (int i = 0; i < returnArray.length; i++) {
    returnArray[i] = (String[]) results.get(i);
    // for(int j = 0;j < returnArray[i].length;j++){
    // System.out.println(returnArray[i][j]);
    // }

    }
    return returnArray;
    }catch (Exception e){
    return null;
    }
    }
    /**
    * 对Excel的各个单元格的格式进行判断并转换
    */
    public static String getCellValue(XSSFCell cell) {
    String cellValue = "";
    DecimalFormat df = new DecimalFormat("#");
    switch (cell.getCellType()) {
    case XSSFCell.CELL_TYPE_STRING:
    cellValue =cell.getRichStringCellValue().getString().trim();
    break;
    case XSSFCell.CELL_TYPE_NUMERIC:
    cellValue =df.format(cell.getNumericCellValue()).toString();
    break;
    case XSSFCell.CELL_TYPE_BOOLEAN:
    cellValue = String.valueOf(cell.getBooleanCellValue()).trim();
    break;
    case XSSFCell.CELL_TYPE_FORMULA:
    cellValue =cell.getCellFormula();
    break;
    default:
    cellValue = "";
    }
    return cellValue;
    }
    }

    JsonFormatTool 类 是将json数据转化为可格式化输出的数据

    package utl;

    /**
    * Created by jiangcui on 2018/5/25.
    */
    public class JsonFormatTool {

    /**
    * 单位缩进字符串。
    */
    private static String SPACE = " ";

    /**
    * 返回格式化JSON字符串。
    *
    * @param json 未格式化的JSON字符串。
    * @return 格式化的JSON字符串。
    */
    public String formatJson(String json)
    {
    StringBuffer result = new StringBuffer();

    int length = json.length();
    int number = 0;
    char key = 0;

    //遍历输入字符串。
    for (int i = 0; i < length; i++)
    {
    //1、获取当前字符。
    key = json.charAt(i);

    //2、如果当前字符是前方括号、前花括号做如下处理:
    if((key == '[') || (key == '{') )
    {
    //(1)如果前面还有字符,并且字符为“:”,打印:换行和缩进字符字符串。
    if((i - 1 > 0) && (json.charAt(i - 1) == ':'))
    {
    result.append(' ');
    result.append(indent(number));
    }

    //(2)打印:当前字符。
    result.append(key);

    //(3)前方括号、前花括号,的后面必须换行。打印:换行。
    result.append(' ');

    //(4)每出现一次前方括号、前花括号;缩进次数增加一次。打印:新行缩进。
    number++;
    result.append(indent(number));

    //(5)进行下一次循环。
    continue;
    }

    //3、如果当前字符是后方括号、后花括号做如下处理:
    if((key == ']') || (key == '}') )
    {
    //(1)后方括号、后花括号,的前面必须换行。打印:换行。
    result.append(' ');

    //(2)每出现一次后方括号、后花括号;缩进次数减少一次。打印:缩进。
    number--;
    result.append(indent(number));

    //(3)打印:当前字符。
    result.append(key);

    //(4)如果当前字符后面还有字符,并且字符不为“,”,打印:换行。
    if(((i + 1) < length) && (json.charAt(i + 1) != ','))
    {
    result.append(' ');
    }

    //(5)继续下一次循环。
    continue;
    }

    //4、如果当前字符是逗号。逗号后面换行,并缩进,不改变缩进次数。
    if((key == ','))
    {
    result.append(key);
    result.append(' ');
    result.append(indent(number));
    continue;
    }

    //5、打印:当前字符。
    result.append(key);
    }

    return result.toString();
    }

    /**
    * 返回指定次数的缩进字符串。每一次缩进三个空格,即SPACE。
    *
    * @param number 缩进次数。
    * @return 指定缩进次数的字符串。
    */
    private String indent(int number)
    {
    StringBuffer result = new StringBuffer();
    for(int i = 0; i < number; i++)
    {
    result.append(SPACE);
    }
    return result.toString();
    }
    }



    TestData包下面存放需要读取的excel文件,路径为:"C:\Users\jiangcui\IdeaProjects\httpclient\src\main\TestData\LoginTest.xlsx"


    以下为此实例需要说明:
    1)如果excel文件为.xls文件,则需要使用apache.poi的HSSF(针对excel2003及以前的版本),如果是.xlsx文件,则需要使用apache.poi的XSSF
    2)由于testng版本问题,有时候会导致org.testng.internal.reflect.MethodMatcherException异常(这个待确定,初步估计是与testng版本相关)


    此实例pom 文档内容如下:
    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>httpclient</groupId>
    <artifactId>httpclient</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
    <!-- 指明编译源代码时使用的字符编码,maven编译的时候默认使用的GBK编码,
    通过project.build.sourceEncoding属性设置字符编码,告诉maven这个项目使用UTF-8来编译 -->
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

    <!--这里可以设置需要运行group-->
    <groupsTest>execShell</groupsTest>

    </properties>

    <dependencies>

    <!--tesgng依赖包-->
    <dependency>
    <groupId>org.testng</groupId>
    <artifactId>testng</artifactId>
    <version>6.9.13</version>
    </dependency>

    <!--poi创建和读取office文档-->

    <dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>3.17</version>
    </dependency>

    <!--Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容-->

    <dependency>
    <groupId>org.jsoup</groupId>
    <artifactId>jsoup</artifactId>
    <version>1.9.1</version>
    </dependency>


    <dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.5.2</version>
    </dependency>
    <dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient-cache</artifactId>
    <version>4.5.2</version>
    </dependency>
    <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpmime</artifactId>
    <version>4.5.2</version>
    </dependency>

    <!--java中建立sftp服务连接所需的jar包-->
    <dependency>
    <groupId>com.jcraft</groupId>
    <artifactId>jsch</artifactId>
    <version>0.1.54</version>
    </dependency>

    <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.38</version>
    </dependency>

    <!--下面几个引用包是我们手动下载并添加的依赖-->
    <dependency>
    <groupId>commons-beanutils</groupId>
    <artifactId>commons-beanutils</artifactId>
    <version>1.8.0</version>
    <scope>system</scope>
    <systemPath>${basedir}/json/commons-beanutils-1.8.0.jar</systemPath>
    </dependency>

    <dependency>
    <groupId>commons-collections</groupId>
    <artifactId>commons-collections</artifactId>
    <version>3.2.1</version>
    <scope>system</scope>
    <systemPath>${basedir}/json/commons-collections-3.2.1.jar</systemPath>
    </dependency>

    <dependency>
    <groupId>commons-lang</groupId>
    <artifactId>commons-lang</artifactId>
    <version>2.5</version>
    <scope>system</scope>
    <systemPath>${basedir}/json/commons-lang-2.5.jar</systemPath>
    </dependency>

    <dependency>
    <groupId>commons-logging</groupId>

    <artifactId>commons-logging</artifactId>
    <version>1.1.1</version>
    <scope>system</scope>
    <systemPath>${basedir}/json/commons-logging-1.1.1.jar</systemPath>
    </dependency>

    <dependency>
    <groupId>ezmorph</groupId>
    <artifactId>ezmorph</artifactId>
    <version>1.0.6</version>
    <scope>system</scope>
    <systemPath>${basedir}/json/ezmorph-1.0.6.jar</systemPath>
    </dependency>

    <dependency>
    <groupId>json-lib</groupId>
    <artifactId>json-lib</artifactId>
    <version>2.4</version>
    <scope>system</scope>
    <systemPath>${basedir}/json/json-lib-2.4-jdk15.jar</systemPath>
    </dependency>

    <dependency>
    <groupId>org.json</groupId>
    <artifactId>json</artifactId>
    <version>20140107</version>
    </dependency>

    </dependencies>


    <build>
    <plugins>
    <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
    <source>1.6</source>
    <target>1.6</target>
    </configuration>
    </plugin>

    <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.19.1</version>
    <configuration>
    <threadCount>1</threadCount>
    <forkCount>1</forkCount>
    <reuseForks>true</reuseForks>
    <argLine>-Xmx1024m -XX:MaxPermSize=256m</argLine>
    <forkMode>once</forkMode>
    <argLine>-Dfile.encoding=UTF-8</argLine>
    <groups>${groupsTest}</groups>
    <includes>
    <include>**/*Test.java</include>
    </includes>
    </configuration>
    </plugin>

    <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.18.1</version>
    <configuration>
    <suiteXmlFiles>
    <suiteXmlFile>testng.xml</suiteXmlFile>
    </suiteXmlFiles>
    </configuration>
    </plugin>
    </plugins>
    </build>
    </project>

    testng.xml 内容如下:

    <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >


    <suite name="Suite1">
    <test name="Test1">
    <classes>
    <class name="loginjdtest.FirstTest"/> //指定包名及包名下的java文件
    </classes>
    </test>
    </suite>


    参考资料:
    1)https://www.cnblogs.com/haigege/p/5450742.html

    2)https://www.cnblogs.com/meitian/p/5199079.html



  • 相关阅读:
    备忘录方法与动态规划比较
    struct大小
    位域
    cocos2d-x获得系统的语言
    游戏中的心理学:利用归因错误让玩家更爱你的游戏
    武侠游戏核心追求点
    将“Cocos2dx-截屏并设置图片尺寸 ”中cocos2d-x代码转换为2.2的代码
    Cocos2dx-截屏并设置图片尺寸
    信息图:iOS 7开发者需要知道的事
    批处理学习 二
  • 原文地址:https://www.cnblogs.com/jshtest/p/9098639.html
Copyright © 2011-2022 走看看