项目管理Maven系列(四)- 结合Selenium、Appium、OkHttp、HttpClient

2022-07-25 17:30:17 浏览数 (1)

项目管理Maven系列(四)

结合Selenium、Appium、OkHttp、HttpClient

目录

  • 1、Maven Selenium
  • 2、Maven Appium
  • 3、Maven OkHttp
  • 4、Maven HttpClient

1、Maven Selenium

Selenium TestNG Maven

创建My_Maven_Selenium_Demo项目

base包用于存放基础准备(BaseParpare类),即启动与退出。

testcases包用于存放测试用例(CaseDemo类)。

driver文件夹存放浏览器驱动(Chrome浏览器驱动)。

1、BaseParpare类(存放用例执行前与执行后的操作)

脚本代码:

代码语言:javascript复制
package com.test.demo.base;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;

public class BaseParpare {

    public WebDriver driver;

    @BeforeClass
    public void setUp() {
        System.setProperty("webdriver.chrome.driver", "D:\workspace2\My_TestNG_Selenium_Demo\driver\chromedriver.exe");
        ChromeOptions option = new ChromeOptions();
        option.addArguments("disable-infobars");
        driver = new ChromeDriver(option);
        driver.manage().window().maximize();
        driver.navigate().to("http://www.baidu.com");
    }

    @AfterClass
    public void tearDown() {
        driver.close();
        driver.quit();
    }
      
}

2、CaseDemo类(继承BaseParpare类,存放用例)

脚本代码:

代码语言:javascript复制
package com.test.demo.testcases;

import org.openqa.selenium.By;
import org.testng.annotations.Test;
import com.test.demo.base.BaseParpare;

public class CaseDemo extends BaseParpare {

    @Test
    public void testCase1() {
        driver.findElement(By.id("kw")).sendKeys("selenium");
    }

    @Test
    public void testCase2() {
        driver.findElement(By.id("su")).click();
    }

    @Test
    public void testCase3() {
        System.out.println(driver.getTitle());
    }

}

3、testng.xml

文件内容:

代码语言:javascript复制
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite" parallel="tests" thread-count="1">
    <test name="Test" enabled="true">
        <classes>
            <class name="com.test.demo.testcases.CaseDemo" />
        </classes>
    </test>
</suite>

4、pom.xml

添加的依赖(TestNG、Selenium):

代码语言:javascript复制
<dependencies>
    <dependency>
        <groupId>org.testng</groupId>
        <artifactId>testng</artifactId>
        <version>6.11</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.seleniumhq.selenium</groupId>
        <artifactId>selenium-java</artifactId>
        <version>3.12.0</version>
    </dependency>
    <dependency>
        <groupId>org.seleniumhq.selenium</groupId>
        <artifactId>selenium-server</artifactId>
        <version>3.12.0</version>
    </dependency>
</dependencies>

5、执行脚本(pom.xml鼠标右键Run As--->Maven test即可)。

6、执行结果:控制台打印结果信息:3个测试方法执行成功。

2、Maven Appium

Appium TestNG Maven

创建My_Maven_Appium_Demo项目

base包用于存放基础准备(BaseParpare类),即启动与退出。

testcases包用于存放测试用例(CaseDemo类)。

app文件夹存放测试应用(testApp.apk)。

1、BaseParpare类(存放用例执行前与执行后的操作)

脚本代码:

代码语言:javascript复制
package com.test.demo.base;

import java.io.File;
import java.net.URL;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import io.appium.java_client.android.AndroidDriver;
import io.appium.java_client.android.AndroidElement;

public class BaseParpare {

    public AndroidDriverdriver;

    @BeforeClass
    public void setUp() throws Exception {

        File classpathRoot = new File(System.getProperty("user.dir"));
        File appDir = new File(classpathRoot, "app");
        File app = new File(appDir, "testApp.apk");

        DesiredCapabilities capabilities = new DesiredCapabilities();

        // 使用哪个自动化测试引擎
        // 默认为Appium,或Selendroid或UiAutomator2或Espresso用于Android;或XCUITest用于IOS
        capabilities.setCapability("automationName", "Appium");

        // 使用哪个移动操作系统平台
        // iOS, Android, FirefoxOS
        capabilities.setCapability("platformName", "Android");

        // 移动操作系统版本
        capabilities.setCapability("platformVersion", "6.0");

        // 使用的移动设备或模拟器的类型
        // iPhone Simulator, iPad Simulator, iPhone Retina 4-inch, Android
        // Emulator, Galaxy S4 等等
        // 在IOS上,这个关键字的值必须是使用`instruments -s devices`得到的可使用的设备名称之一
        // 在Android上,这个关键字目前不起作用
        capabilities.setCapability("deviceName", "honor");

        // 连接的物理设备的唯一设备标识
        capabilities.setCapability("udid", "316d9073");

        // `.ipa`或`.apk`文件所在的本地绝对路径或者远程路径,也可以是一个包括两者之一的`.zip`
        // Appium会先尝试安装路径对应的应用在适当的真机或模拟器上
        // 针对Android,如果你指定`app-package`和`app-activity`的话,那么就可以不指定`app`
        // 例如/abs/path/to/my.apk or http://myapp.com/app.ipa
        capabilities.setCapability("app", app.getAbsolutePath());

        // 要运行Android应用的包名
        capabilities.setCapability("appPackage", "com.example.testapp");

        // 要从包中启动的Android activity的活动名称
        capabilities.setCapability("appActivity", "com.example.testapp.MainActivity");

        // 启用Unicode输入法,设置为true可以输入中文字符,默认为false
        capabilities.setCapability("unicodeKeyboard", true);

        // 在设定了`unicodeKeyboard`关键字运行Unicode测试结束后,将键盘重置为其原始状态
        // 如果单独使用,将会被忽略,默认值`false`
        capabilities.setCapability("resetKeyboard", true);

        // 设置为true,每次启动时覆盖session,否则第二次运行会报错不能新建session
        capabilities.setCapability("sessionOverride", true);

        // 在此会话之前不要重置应用程序状态
        // Android 不要停止应用程序,不要清除应用程序数据,也不要卸载apk
        // IOS 测试后不要销毁或关闭SIM卡。开始测试运行在任何模拟运行,或设备插入
        capabilities.setCapability("noReset", true);

        // 执行完整的重置
        // Android 停止应用程序,清除应用程序数据并在测试后卸载apk
        // IOS 在真机设备测试后卸载应用程序,在模拟器测试后摧毁模拟器
        capabilities.setCapability("fullReset", false);

        // 设置命令超时时间,单位:秒
        // 达到超时时间仍未接收到新的命令时Appium会假设客户端退出然后自动结束会话
        capabilities.setCapability("newCommandTimeout", 60);

        driver = new AndroidDriver(new URL("http://127.0.0.1:4723/wd/hub"), capabilities);
        Thread.sleep(2000);
    }

    @AfterClass
    public void tearDown() {
        driver.quit();
    }
      
}

2、CaseDemo类(继承BaseParpare类,存放用例)

脚本代码:

代码语言:javascript复制
package com.test.demo.testcases;

import org.openqa.selenium.By;
import org.testng.annotations.Test;
import com.test.demo.base.BaseParpare;

public class CaseDemo extends BaseParpare {

    @Test
    public void testCase1() {
        driver.findElement(By.id("com.example.testapp:id/urlField")).sendKeys("https://www.baidu.com/");
    }

    @Test
    public void testCase2() {
        driver.findElement(By.id("com.example.testapp:id/goButton")).click();
    }

}

3、testng.xml

文件内容:

代码语言:javascript复制
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite" parallel="tests" thread-count="1">
    <test name="Test" enabled="true">
        <classes>
            <class name="com.test.demo.testcases.CaseDemo" />
        </classes>
    </test>
</suite>

4、pom.xml

添加的依赖(TestNG、Appium):

代码语言:javascript复制
<dependencies>
    <dependency>
        <groupId>org.testng</groupId>
        <artifactId>testng</artifactId>
        <version>6.11</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>io.appium</groupId>
        <artifactId>java-client</artifactId>
        <version>6.1.0</version>
    </dependency>
</dependencies>

5、开启Appium服务,执行脚本(pom.xml鼠标右键Run As--->Maven test即可)。

6、执行结果:控制台打印结果信息:2个测试方法执行成功。

3、Maven OkHttp

OkHttp TestNG Maven

创建My_Maven_OkHttp_Demo项目

Get类(Get请求)。

Post类(Post请求)。

application.properties文件(配置文件,设置请求链接)。

1、Get类。

getCookie方法:使用Get请求,获取响应的Cookie信息。

getWithCookie方法:依赖getCookie方法,使用Get请求,将getCookie方法获取的Cookie信息做为请求头Cookie。

脚本代码:

代码语言:javascript复制
package com.test.demo;

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.PropertyResourceBundle;
import java.util.ResourceBundle;
import java.util.concurrent.TimeUnit;
import org.testng.annotations.Test;
import okhttp3.Headers;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

/**
 * Get请求
 *
 * @author wangmcn
 *
 */
public class Get {
      
    final int CONNECT_TIMEOUT = 30;
    final int READ_TIMEOUT = 30;
    final int WRITE_TIMEOUT = 30;
    
    // 创建OkHttpClient对象
    OkHttpClient client = new OkHttpClient.Builder()
                .connectTimeout(CONNECT_TIMEOUT, TimeUnit.SECONDS) // 设置连接超时时间
                .readTimeout(READ_TIMEOUT, TimeUnit.SECONDS) // 设置读超时时间
                .writeTimeout(WRITE_TIMEOUT, TimeUnit.SECONDS) // 设置写超时时间
                .retryOnConnectionFailure(true) // 是否自动重连
                .build();

    private String store;
    private static String url;
    private static ResourceBundle rb;
    private static BufferedInputStream inputStream;
    
    static {
        String proFilePath = System.getProperty("user.dir")   "\config\application.properties";
        try {
            inputStream = new BufferedInputStream(new FileInputStream(proFilePath));
            rb = new PropertyResourceBundle(inputStream);
            url = rb.getString("url");
            inputStream.close();
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    @Test
    public void getCookie() throws IOException {

        // 从配置文件中拼接测试的url
        String uri = rb.getString("getCookie.uri");
        String testUrl = url   uri;

        // 创建Request对象
        Request request = new Request.Builder()
                .url(testUrl)
                .get()
                .build();
        
        // 得到Response对象
        Response response = client.newCall(request).execute();
        
        if(response.isSuccessful()){
            System.out.println("获取响应状态: "   response.code());
            System.out.println("获取响应信息: "   response.message());
            System.out.println("获取网页源码: "   response.body().string());
        }
        
        // 获取响应头
        Headers responseHeader = response.headers();
        System.out.println("获取响应头: "   responseHeader);
        
        // 获取Cookie
        this.store = responseHeader.get("Set-Cookie");
        System.out.println("获取Cookie: "   responseHeader.get("Set-Cookie"));
        
        // 清除并关闭线程池
        client.dispatcher().executorService().shutdown();
        // 清除并关闭连接池
        client.connectionPool().evictAll();
            
    }

    @Test(dependsOnMethods = { "getCookie" })
    public void getWithCookie() throws IOException {
            
        // 从配置文件中拼接测试的url
        String uri = rb.getString("get.cookie");
        String testUrl = url   uri;

        // 创建Request对象
        Request request = new Request.Builder()
                .url(testUrl)
                .addHeader("Cookie", this.store)
                .get()
                .build();
        
        // 得到Response对象
        Response response = client.newCall(request).execute();
        
        if(response.isSuccessful()){
            System.out.println("获取响应状态: "   response.code());
            System.out.println("获取响应信息: "   response.message());
            System.out.println("获取网页源码: "   response.body().string());
        }
        
        // 清除并关闭线程池
        client.dispatcher().executorService().shutdown();
        // 清除并关闭连接池
        client.connectionPool().evictAll();

    }

}

2、Post类。

getCookie方法:使用Get请求,获取响应的Cookie信息。

postWithCookie方法:依赖getCookie方法,使用Post请求,将getCookie方法获取的Cookie信息做为请求头Cookie,发送Json数据。

脚本代码:

代码语言:javascript复制
package com.test.demo;

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.PropertyResourceBundle;
import java.util.ResourceBundle;
import java.util.concurrent.TimeUnit;
import org.json.JSONObject;
import org.testng.Assert;
import org.testng.annotations.Test;
import okhttp3.Headers;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;

/**
 * Post请求
 *
 * @author wangmcn
 *
 */
public class Post {

    final int CONNECT_TIMEOUT = 30;
    final int READ_TIMEOUT = 30;
    final int WRITE_TIMEOUT = 30;
    
    // 创建OkHttpClient对象
    OkHttpClient client = new OkHttpClient.Builder()
                .connectTimeout(CONNECT_TIMEOUT, TimeUnit.SECONDS) // 设置连接超时时间
                .readTimeout(READ_TIMEOUT, TimeUnit.SECONDS) // 设置读超时时间
                .writeTimeout(WRITE_TIMEOUT, TimeUnit.SECONDS) // 设置写超时时间
                .retryOnConnectionFailure(true) // 是否自动重连
                .build();

    private String store;
    private static String url;
    private static ResourceBundle rb;
    private static BufferedInputStream inputStream;
    
    static {
        String proFilePath = System.getProperty("user.dir")   "\config\application.properties";
        try {
            inputStream = new BufferedInputStream(new FileInputStream(proFilePath));
            rb = new PropertyResourceBundle(inputStream);
            url = rb.getString("url");
            inputStream.close();
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    @Test
    public void getCookie() throws IOException {

        // 从配置文件中拼接测试的url
        String uri = rb.getString("getCookie.uri");
        String testUrl = url   uri;

        // 创建Request对象
        Request request = new Request.Builder()
                .url(testUrl)
                .get()
                .build();
        
        // 得到Response对象
        Response response = client.newCall(request).execute();
        
        if(response.isSuccessful()){
            System.out.println("获取响应状态: "   response.code());
            System.out.println("获取响应信息: "   response.message());
            System.out.println("获取网页源码: "   response.body().string());
        }
        
        // 获取响应头
        Headers responseHeader = response.headers();
        System.out.println("获取响应头: "   responseHeader);
        
        // 获取Cookie
        this.store = responseHeader.get("Set-Cookie");
        System.out.println("获取Cookie: "   responseHeader.get("Set-Cookie"));
        
        // 清除并关闭线程池
        client.dispatcher().executorService().shutdown();
        // 清除并关闭连接池
        client.connectionPool().evictAll();
            
    }

    @Test(dependsOnMethods = { "getCookie" })
    public void postWithCookie() throws IOException {
            
        // 从配置文件中拼接测试的url
        String uri = rb.getString("post.cookie");
        String testUrl = url   uri;

        // 数据类型为Json格式
        MediaType JSON = MediaType.parse("application/json; charset=utf-8");
        // Json数据
        String jsonStr = "{"username":"admin","password":"123456"}";
        // 得到RequestBody对象
        RequestBody body = RequestBody.create(JSON, jsonStr);
        
        // 创建Request对象
        Request request = new Request.Builder()
                .url(testUrl)
                .addHeader("Content-Type", "application/json;charset:utf-8")
                .addHeader("Cookie", this.store)
                .post(body)
                .build();

        // 得到Response对象
        Response response = client.newCall(request).execute();
        
        if(response.isSuccessful()){
            System.out.println("获取响应状态: "   response.code());
            System.out.println("获取响应信息: "   response.message());
        }
        
        // 将返回的响应结果字符串转化成为Json对象
        JSONObject resultJson = new JSONObject(response.body().string());
        System.out.println("获取网页源码: "   resultJson);
        
        // 断言
        Assert.assertEquals((String)resultJson.get("admin"), "success");
        Assert.assertEquals((String)resultJson.get("status"), "1");
        
        // 清除并关闭线程池
        client.dispatcher().executorService().shutdown();
        // 清除并关闭连接池
        client.connectionPool().evictAll();
            
    }

}

3、testng.xml

文件内容:

代码语言:javascript复制
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite" parallel="tests" thread-count="1">
    <test name="Test" enabled="true">
        <classes>
            <class name="com.test.demo.Get" />
            <class name="com.test.demo.Post" />
        </classes>
    </test>
</suite>

4、pom.xml

添加的依赖(TestNG、OkHttp、JSON):

代码语言:javascript复制
<dependencies>
    <dependency>
        <groupId>org.testng</groupId>
        <artifactId>testng</artifactId>
        <version>6.11</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>com.squareup.okhttp3</groupId>
        <artifactId>okhttp</artifactId>
        <version>3.10.0</version>
    </dependency>
    <dependency>
        <groupId>org.json</groupId>
        <artifactId>json</artifactId>
        <version>20180813</version>
    </dependency>
</dependencies>

5、执行脚本(pom.xml鼠标右键Run As--->Maven test即可)。

6、执行结果:控制台打印结果信息:4个测试方法执行成功。

4、Maven HttpClient

HttpClient TestNG Maven

创建My_Maven_HttpClient_Demo项目

Get类(Get请求)。

Post类(Post请求)。

application.properties文件(配置文件,设置请求链接)。

1、Get类。

getCookie方法:使用Get请求,获取响应的Cookie信息。

getWithCookie方法:依赖getCookie方法,使用Get请求,将getCookie方法获取的Cookie信息做为请求头Cookie。

脚本代码:

代码语言:javascript复制
package com.test.demo;

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.List;
import java.util.PropertyResourceBundle;
import java.util.ResourceBundle;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.cookie.Cookie;
import org.apache.http.impl.client.BasicCookieStore;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.cookie.BasicClientCookie;
import org.apache.http.util.EntityUtils;
import org.testng.annotations.Test;
import org.apache.http.HttpEntity;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.CookieStore;
import org.apache.http.client.config.RequestConfig;

/**
 * Get请求
 *
 * @author wangmcn
 *
 */
public class Get {

    private Liststore;
    private CookieStore cookieStore;
    private static String url;
    private static ResourceBundle rb;
    private static BufferedInputStream inputStream;
    
    static {
        String proFilePath = System.getProperty("user.dir")   "\config\application.properties";
        try {
            inputStream = new BufferedInputStream(new FileInputStream(proFilePath));
            rb = new PropertyResourceBundle(inputStream);
            url = rb.getString("url");
            inputStream.close();
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    @Test
    public void getCookie() throws ClientProtocolException, IOException {

        // 从配置文件中拼接测试的url
        String uri = rb.getString("getCookie.uri");
        String testUrl = url   uri;

        // 创建CookieStore对象
        cookieStore = new BasicCookieStore();
            
        // 创建CloseableHttpClient对象
        CloseableHttpClient httpclient = HttpClients.custom()
                    // 设置Cookie
                    .setDefaultCookieStore(cookieStore)
                    .build();
            
        // 创建HttpGet对象
        HttpGet httpget = new HttpGet(testUrl);

        // 设置超时
        RequestConfig requestConfig = RequestConfig.custom()
                    .setConnectTimeout(15000) // 设置连接超时时间,单位毫秒
                    .setSocketTimeout(15000) // 请求获取数据的超时时间,单位毫秒
                    .setConnectionRequestTimeout(15000) // 设置从connect Manager获取Connection超时时间,单位毫秒
                    .build();
        httpget.setConfig(requestConfig);
        
        // 执行Get请求
        CloseableHttpResponse response = httpclient.execute(httpget);
        // 获取响应状态
        System.out.println("获取响应状态: "   response.getStatusLine().getStatusCode());
        // 获取返回实体
        HttpEntity entity = response.getEntity();
        // 获取网页源码
        System.out.println("获取网页源码:"   EntityUtils.toString(entity, "utf-8"));
        // 获取响应内容类型
        System.out.println("获取响应内容类型:"   entity.getContentType().getValue());
        
        // 获取Cookie
        this.store = cookieStore.getCookies();
        ListcookieList = cookieStore.getCookies();
        for (Cookie cookies : cookieList) {
            System.out.println("Cookie: "   cookies.getName()   "; "   cookies.getValue());
        }
        
        // 关闭流和释放系统资源
        response.close();
        // 关闭客户端
        httpclient.close();
    
    }

    @Test(dependsOnMethods = { "getCookie" })
    public void getWithCookie() throws ClientProtocolException, IOException {
            
        // 从配置文件中拼接测试的url
        String uri = rb.getString("get.cookie");
        String testUrl = url   uri;

        for (int i = 0; i < this.store.size(); i  ) {
            // 创建CookieStore对象
            cookieStore = new BasicCookieStore();
        
            // 创建BasicClientCookie对象,添加Cookie
            BasicClientCookie cookie = new BasicClientCookie(this.store.get(i).getName(), this.store.get(i).getValue());
            cookie.setVersion(0);
            cookie.setDomain("localhost");
            cookie.setPath("/");
            cookieStore.addCookie(cookie); 
        }

        // 创建CloseableHttpClient对象
        CloseableHttpClient httpclient = HttpClients.custom()
                    // 设置Cookie
                    .setDefaultCookieStore(cookieStore)
                    .build();
        
        // 创建HttpGet对象
        HttpGet httpget = new HttpGet(testUrl);

        // 设置超时
        RequestConfig requestConfig = RequestConfig.custom()
                    .setConnectTimeout(15000) // 设置连接超时时间,单位毫秒
                    .setSocketTimeout(15000) // 请求获取数据的超时时间,单位毫秒
                    .setConnectionRequestTimeout(15000) // 设置从connect Manager获取Connection超时时间,单位毫秒
                    .build();
        httpget.setConfig(requestConfig);
        
        // 执行Get请求
        CloseableHttpResponse response = httpclient.execute(httpget);

        // 获取响应状态
        int statusCode = response.getStatusLine().getStatusCode();
        System.out.println("获取响应状态: "   statusCode);

        if (statusCode == 200) {
            String result = EntityUtils.toString(response.getEntity(), "utf-8");
            System.out.println("获取网页源码:"   result);
        }

        // 关闭流和释放系统资源
        response.close();
        // 关闭客户端
        httpclient.close();
            
    }
}

2、Post类。

getCookie方法:使用Get请求,获取响应的Cookie信息。

postWithCookie方法:依赖getCookie方法,使用Post请求,将getCookie方法获取的Cookie信息做为请求头Cookie,发送Json数据。

脚本代码:

代码语言:javascript复制
package com.test.demo;

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.List;
import java.util.PropertyResourceBundle;
import java.util.ResourceBundle;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.cookie.Cookie;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.BasicCookieStore;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.cookie.BasicClientCookie;
import org.apache.http.util.EntityUtils;
import org.json.JSONObject;
import org.testng.Assert;
import org.testng.annotations.Test;
import org.apache.http.HttpEntity;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.CookieStore;
import org.apache.http.client.config.RequestConfig;

/**
 * Post请求
 *
 * @author wangmcn
 *
 */
public class Post {

    private Liststore;
    private CookieStore cookieStore;
    private static String url;
    private static ResourceBundle rb;
    private static BufferedInputStream inputStream;
    
    static {
        String proFilePath = System.getProperty("user.dir")   "\config\application.properties";
        try {
            inputStream = new BufferedInputStream(new FileInputStream(proFilePath));
            rb = new PropertyResourceBundle(inputStream);
            url = rb.getString("url");
            inputStream.close();
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    @Test
    public void getCookie() throws ClientProtocolException, IOException {

        // 从配置文件中拼接测试的url
        String uri = rb.getString("getCookie.uri");
        String testUrl = url   uri;

        // 创建CookieStore对象
        cookieStore = new BasicCookieStore();
            
        // 创建CloseableHttpClient对象
        CloseableHttpClient httpclient = HttpClients.custom()
                    // 设置Cookie
                    .setDefaultCookieStore(cookieStore)
                    .build();
            
        // 创建HttpGet对象
        HttpGet httpget = new HttpGet(testUrl);

        // 设置超时
        RequestConfig requestConfig = RequestConfig.custom()
                    .setConnectTimeout(15000) // 设置连接超时时间,单位毫秒
                    .setSocketTimeout(15000) // 请求获取数据的超时时间,单位毫秒
                    .setConnectionRequestTimeout(15000) // 设置从connect Manager获取Connection超时时间,单位毫秒
                    .build();
        httpget.setConfig(requestConfig);
        
        // 执行Get请求
        CloseableHttpResponse response = httpclient.execute(httpget);
        // 获取响应状态
        System.out.println("获取响应状态: "   response.getStatusLine().getStatusCode());
        // 获取返回实体
        HttpEntity entity = response.getEntity();
        // 获取网页源码
        System.out.println("获取网页源码:"   EntityUtils.toString(entity, "utf-8"));
        // 获取响应内容类型
        System.out.println("获取响应内容类型:"   entity.getContentType().getValue());
        
        // 获取Cookie
        this.store = cookieStore.getCookies();
        ListcookieList = cookieStore.getCookies();
        for (Cookie cookies : cookieList) {
            System.out.println("Cookie: "   cookies.getName()   "; "   cookies.getValue());
        }
        
        // 关闭流和释放系统资源
        response.close();
        // 关闭客户端
        httpclient.close();
    
    }

    @Test(dependsOnMethods = { "getCookie" })
    public void postWithCookie() throws IOException {

        // 从配置文件中拼接测试的url
        String uri = rb.getString("post.cookie");
        String testUrl = url   uri;

        for (int i = 0; i < this.store.size(); i  ) {
            // 创建CookieStore对象
            cookieStore = new BasicCookieStore();
        
            // 创建BasicClientCookie对象,添加Cookie
            BasicClientCookie cookie = new BasicClientCookie(this.store.get(i).getName(), this.store.get(i).getValue());
            cookie.setVersion(0);
            cookie.setDomain("localhost");
            cookie.setPath("/");
            cookieStore.addCookie(cookie); 
        }

        // 创建CloseableHttpClient对象
        CloseableHttpClient httpclient = HttpClients.custom()
                    // 设置Cookie
                    .setDefaultCookieStore(cookieStore)
                    .build();

        // 创建HttpPost对象
        HttpPost httpPost = new HttpPost(testUrl);

        // 设置超时
        RequestConfig requestConfig = RequestConfig.custom()
                    .setConnectTimeout(15000) // 设置连接超时时间,单位毫秒
                    .setSocketTimeout(15000) // 请求获取数据的超时时间,单位毫秒
                    .setConnectionRequestTimeout(15000) // 设置从connect Manager获取Connection超时时间,单位毫秒
                    .build();
        httpPost.setConfig(requestConfig);
        
        // 设置请求头信息
        httpPost.setHeader("content-type", "application/json; charset=utf-8");
        // 添加Json参数
        JSONObject param = new JSONObject();
        param.put("username", "admin");
        param.put("password", "123456");
        // 将参数信息添加到方法中
        StringEntity entity = new StringEntity(param.toString(), "utf-8");
        httpPost.setEntity(entity);
        
        // 执行Post请求
        CloseableHttpResponse response = httpclient.execute(httpPost);
        
        // 获取响应结果
        String result = EntityUtils.toString(response.getEntity(), "utf-8");
        
        // 将返回的响应结果字符串转化成为Json对象
        JSONObject resultJson = new JSONObject(result);
        // 获取网页源码
        System.out.println("获取网页源码:"   resultJson);
        
        // 断言
        Assert.assertEquals((String)resultJson.get("admin"), "success");
        Assert.assertEquals((String)resultJson.get("status"), "1");
        
        // 关闭流和释放系统资源
        response.close();
        // 关闭客户端
        httpclient.close();

    }
      
}

3、testng.xml

文件内容:

代码语言:javascript复制
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite" parallel="tests" thread-count="1">
    <test name="Test" enabled="true">
        <classes>
            <class name="com.test.demo.Get" />
            <class name="com.test.demo.Post" />
        </classes>
    </test>
</suite>

4、pom.xml

添加的依赖(TestNG、HttpClient、JSON):

代码语言:javascript复制
<dependencies>
    <dependency>
        <groupId>org.testng</groupId>
        <artifactId>testng</artifactId>
        <version>6.11</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpclient</artifactId>
        <version>4.5.6</version>
    </dependency>
    <dependency>
        <groupId>org.json</groupId>
        <artifactId>json</artifactId>
        <version>20180813</version>
    </dependency>
</dependencies>

5、执行脚本(pom.xml鼠标右键Run As--->Maven test即可)。

6、执行结果:控制台打印结果信息:4个测试方法执行成功。

0 人点赞