Interface Automation Test –java+testng testing Restful Web Service
Keywords: rest-based Web services, interface Automation testing, data-driven testing, testing restful WEB service, data separation, java+maven+testng
This article mainly describes how to use Java for RESTful Web service to do interface Automation testing (data-driven), compared to UI Automation, interface automation stability, high reliability, low degree of implementation, automation cost-effective. The tool or class library used is TestNG, Apache POI, Jayway Rest-assured,skyscreamer-jsonassert
Brief introduction:
The idea is data-driven testing, which uses Excel to manage the data, the input data is stored in the Sheet, the data is read, the request is called service, and the response is written to ' Output ' Sheet The actual result, ' Baseline ' is the baseline (expected result) used to compare with the actual results, the ' Comparison ' Sheet is a record of inconsistent results, ' result ' Sheet is a simple result report.
MAVEN Project directory structure:
Detailed Introduction
The core is a test class Httpreqgentest.java consists of four parts
@BeforeTest read ' Input ' and ' Baseline ' sheet of Excel (WorkBook)
and create a new ' Output ', ' Comparison ', ' Result ' three empty sheet
Read Http_request_template.txt content into string
@DataProvider (name = "Workbookdata")
TestNG Dataprovider, first use DataReader constructor, read the data of input in Excel, put in hashmap<string, Recordhandler> The key value of the map is test The id,value of the case is the Recordhandler object, an important member property of this object is the key-value pair of column and value in input sheet, and the Traverse map will test the case ID with the value of the test case That is, the value of the first two columns of input sheet is placed in list<object[]>, and finally the iterator iterator of the list is returned (in order to invoke the @test method)
@Test (Dataprovider = "Workbookdata", description = "Reqgentest")
The test method, which is provided by Dataprovider, first takes the Recordhandler in Myinputdata by ID, generates the request by it and the template, and then executes the request return response. All of this work is done by the Httpreqgen.java class, and with Com.jayway.restassured, the returned response is a JSON body, Compare with pre-filled expected results (also JSON format) in Org.skyscreamer.jsonassert.JSONCompare and baseline, depending on whether the result is pass or fail, will write the result accordingly to the corresponding sheet in Excel.
@AfterTest
Write some data for statistics
Close file stream
Implementation code:
Httpreqgentest.java
Package Com.demo.qa.rest_api_test;import Java.io.fileinputstream;import Java.io.filenotfoundexception;import Java.io.fileoutputstream;import Java.io.ioexception;import Java.io.inputstream;import Java.nio.charset.Charset; Import Java.text.simpledateformat;import java.util.arraylist;import java.util.date;import java.util.Iterator; Import Java.util.list;import Java.util.map;import Org.apache.commons.io.ioutils;import Org.apache.poi.xssf.usermodel.xssfsheet;import Org.apache.poi.xssf.usermodel.xssfworkbook;import Org.json.jsonexception;import Org.skyscreamer.jsonassert.jsoncompare;import Org.skyscreamer.jsonassert.jsoncomparemode;import Org.skyscreamer.jsonassert.jsoncompareresult;import Org.testng.assert;import Org.testng.itest;import Org.testng.itestcontext;import org.testng.annotations.AfterTest; Import Org.testng.annotations.beforetest;import Org.testng.annotations.dataprovider;import Org.testng.annotations.parameters;import Org.testng.annotations.test;import Com.demo.qa.utils.DataReader;Import Com.demo.qa.utils.datawriter;import Com.demo.qa.utils.httpreqgen;import Com.demo.qa.utils.RecordHandler; Import Com.demo.qa.utils.sheetutils;import Com.demo.qa.utils.utils;import Com.jayway.restassured.response.response;public class Httpreqgentest implements ITest {private response response; Private DataReader Myinputdata; Private DataReader Mybaselinedata; private String template; Public String Gettestname () {return "API Test"; } String FilePath = ""; Xssfworkbook wb = null; Xssfsheet inputsheet = null; Xssfsheet baselinesheet = null; Xssfsheet outputsheet = null; Xssfsheet comparsionsheet = null; Xssfsheet resultsheet = null; Private double totalcase = 0; Private double failedcase = 0; Private String StartTime = ""; Private String EndTime = ""; @BeforeTest @Parameters ("WorkBook") public void Setup (String path) {filePath = path; try {wb = new Xssfworkbook (New FileInputStream (FilePath)); } catch (FileNotFoundException e) {e.printstacktrace (); } catch (IOException e) {e.printstacktrace (); } Inputsheet = Wb.getsheet ("Input"); Baselinesheet = Wb.getsheet ("Baseline"); Sheetutils.removesheetbyname (WB, "Output"); Sheetutils.removesheetbyname (WB, "Comparison"); Sheetutils.removesheetbyname (WB, "Result"); Outputsheet = Wb.createsheet ("Output"); Comparsionsheet = Wb.createsheet ("Comparison"); Resultsheet = Wb.createsheet ("Result"); try {InputStream is = HTTPReqGenTest.class.getClassLoader (). getResourceAsStream ("Http_request_template.txt"); Template = Ioutils.tostring (is, Charset.defaultcharset ()); } catch (Exception e) {assert.fail ("problem fetching data from input file:" + e.getmessage ()); } SimpleDateFormat sf=new SimpleDateFormat ("Yyyy-mm-dd HH:mm:ss"); StartTime = Sf.format (New DAte ()); } @DataProvider (name = "Workbookdata") protected iterator<object[]> Testprovider (Itestcontext context) { list<object[]> test_ids = new arraylist<object[]> (); Myinputdata = new DataReader (Inputsheet, True, true, 0); map<string, recordhandler> myinput = Myinputdata.get_map (); Sort map In order so the test cases ran in a fixed order map<string, recordhandler> sortmap = UTILS.S Ortmap (Myinput); For (map.entry<string, recordhandler> entry:sortmap.entrySet ()) {String test_id = Entry.getkey (); String test_case = Entry.getvalue (). Get ("TestCase"); if (!test_id.equals ("") &&!test_case.equals ("")) {Test_ids.add (new object[] {test_id, test_c ASE}); } totalcase++; } mybaselinedata = new DataReader (Baselinesheet, True, true, 0); return Test_ids.iterator (); } @Test (Dataprovider = "Workbookdata", description = "reqgentest") public void Api_test (string ID, String test_case) {Httpreqgen Myreqgen = new Httpreqgen (); try {myreqgen.generate_request (template, Myinputdata.get_record (ID)); Response = Myreqgen.perform_request (); } catch (Exception e) {assert.fail ("problem using Httprequestgenerator to generate response:" + e.getmessage ( )); } String baseline_message = Mybaselinedata.get_record (ID). Get ("Response"); if (response.statuscode () = =) try {datawriter.writedata (Outputsheet, response.asstring (), I D, test_case); Jsoncompareresult result = Jsoncompare.comparejson (Baseline_message, response.asstring (), Jsoncomparemode.non_ extensible); if (!result.passed ()) {Datawriter.writedata (Comparsionsheet, result, ID, test_case); Datawriter.writedata (Resultsheet, "false", ID, Test_case, 0); Datawriter.writedata (Outputsheet); failedcase++; } else {datawriter.writedata (Resultsheet, "true", ID, Test_case, 0); }} catch (Jsonexception e) {datawriter.writedata (Comparsionsheet, "", "problem to assert RESPO NSE and baseline messages: "+e.getmessage (), ID, test_case); Datawriter.writedata (Resultsheet, "error", ID, Test_case, 0); failedcase++; Assert.fail ("Problem to assert Response and baseline messages:" + e.getmessage ()); } else {datawriter.writedata (Outputsheet, Response.statusline (), ID, test_case); if (Baseline_message.equals (Response.statusline ())) {Datawriter.writedata (Resultsheet, "true", ID, Test_ca SE, 0); } else {datawriter.writedata (Comparsionsheet, BaseliNe_message, Response.statusline (), ID, test_case); Datawriter.writedata (Resultsheet, "false", ID, Test_case, 0); Datawriter.writedata (Outputsheet); failedcase++; }}} @AfterTest public void teardown () {SimpleDateFormat sf=new SimpleDateFormat ("Yyyy-mm-dd hh:m M:ss "); EndTime = Sf.format (New Date ()); Datawriter.writedata (Resultsheet, Totalcase, Failedcase, StartTime, endTime); try {fileoutputstream FileOutputStream = new FileOutputStream (FilePath); Wb.write (FileOutputStream); Fileoutputstream.close (); } catch (FileNotFoundException e) {e.printstacktrace (); } catch (IOException e) {e.printstacktrace (); } }}
DataReader
View Code
Httpreqgen
View Code
Recordhandler
View Code
Other unimportant classes are not listed.
Pom.xml
View Pom.xml
Run is performed through the testng XML file, which is configured with the parameter "WorkBook" path
TestNG running results are pass, but in fact there is a case is fail, I just use testng to run, I did not in the @test method add assert assert, so here will not fail, My goal is to fully use Excel to manage maintenance test data and test results, so that the data scripts are completely detached.
Output Sheet
Comparison Sheet
Result Sheet
Of course you can also run the MAVEN project as an executable jar, but you need to add a main function as a portal, the XML test file is passed through the parameters, and you need to configure some plugins in the Pom, like Maven-jar-plugin.
If you still need to do back-end DB check, you can add a few more columns in input, you want to query the table, field, baseline also corresponding to the desired results, here will not repeat.
Http://www.cnblogs.com/wade-xu/p/4229805.html
NOTE: The reprint must indicate the source and the author name.
Interface Automation test framework build –java+testng Test restful service