Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
½Ó¿Ú×Ô¶¯»¯²âÊÔ¿ò¼ÜKarateÈëÃÅ
 
  4029  次浏览      29
 2018-9-18
 

 

±à¼­ÍƼö:

±¾ÎÄÀ´×ÔÓÚ¸öÈË΢²©£¬ÔÚÕâÆªÎÄÕÂÖУ¬ÎÒÃǽ«½éÉÜһϿªÔ´µÄWeb-API×Ô¶¯»¯²âÊÔ¿ò¼Ü¡ª¡ªKarate.

½éÉÜ

ÔÚÕâÆªÎÄÕÂÖУ¬ÎÒÃǽ«½éÉÜһϿªÔ´µÄWeb-API×Ô¶¯»¯²âÊÔ¿ò¼Ü¡ª¡ªKarate

KarateÊÇ»ùÓÚÁíÒ»¸öBDD²âÊÔ¿ò¼ÜCucumberÀ´½¨Á¢µÄ£¬²¢ÇÒ¹²ÓÃÁËһЩÏàͬµÄ˼Ïë¡£ÆäÖÐÖ®Ò»¾ÍÊÇʹÓÃGherkinÎļþ£¬¸ÃÎļþÃèÊöÁ˱»²âÊԵŦÄÜ

ÓëCucumber²»Í¬µÄÊDzâÊÔÓÃÀý²»ÐèÒªÓÃJava±àд£¬²¢ÇÒ±»ÍêÕûµÄÃèÊöÔÚGherkinÎļþÖÐ

ͨ¹ýKarate£¬Äú¿ÉÒÔ±àдÈκÎÀàÐ͵ÄWeb·þÎñ¶ËµÄ²âÊԽű¾£¬²¢¼ì²éÏìÓ¦ÊÇ·ñ·ûºÏÔ¤ÆÚ

KarateµÄÑéÖ¤ÒýÇæ¿ÉÒÔÁé»îµÄ±È½ÏÁ½¸öJSON»òXMLÎļþÄÚÈÝ£¬²»ÊܿոñºÍÊý¾Ý˳ÐòµÄÓ°Ïì

ÓйØKarateµÄ¸üÏêϸµÄÄÚÈÝ£¬Çë²Î¿¼Karate¹Ù·½½éÉÜ

ÌØµã

1.½¨Á¢ÔÚCucumber-JVM»ù´¡ÉÏ

2.¿ÉÒÔÏñ±ê×¼µÄJava¹¤³ÌÒ»ÑùÔËÐвâÊÔ²¢ÇÒ²úÉú±¨¸æ

3.²âÊÔ´úÂëµÄ¿ª·¢²»ÐèÒªÕÆÎÕÈκεÄJava֪ʶ

4.¼´Ê¹¶Ô·Ç±à³ÌÈËÔ±£¬²âÊÔ´úÂëÒ²ºÜÈÝÒ×±àд

»·¾³ÐèÇó

1.JDK1.8¼°ÒÔÉÏ

2.Maven

3.IDEA

ʹÓÃ

´´½¨¹¤³Ì

1.´ò¿ªIDEA£¬File|New|Project

2.Ñ¡ÔñMaven¹¤³Ì£¬µã»÷Next

3.ÊäÈëMaven»ù±¾ÐÅÏ¢£¬µã»÷Next

4.ÊäÈ빤³ÌÃû³ÆºÍ´æ·Å·¾¶£¬µã»÷Finish

Ìí¼ÓÒÀÀµ

ÒªÔÚMavenÏîÄ¿ÖÐʹÓÃKarate£¬ÐèÒª½«karate-apacheÒÀÀµÏîÌí¼Óµ½pom.xml,Èç¹ûʵÏÖJUnit²âÊÔ»¹ÐèÒªÌí¼Ókarate-junit4ÒÀÀµ

<dependencies>
<dependency>
<groupId>com.intuit.karate</groupId>
<artifactId>karate-apache</artifactId>
<version>0.8.0</version>
<scope>test</scope>
</dependency>

<dependency>
<groupId>com.intuit.karate</groupId>
<artifactId>karate-junit4</artifactId>
<version>0.8.0</version>
<scope>test</scope>
</dependency>

</dependencies>

ÉèÖòâÊÔ×ÊÔ´ÎļþĿ¼£¬½¨Òé²âÊÔÓÃÀýÎļþºÍjavaÎļþ·ÅÔÚͬһ¸öĿ¼Ï£¬Óöµ½ÅÓ´óµÄ¹¤³ÌµÄʱºò·½±ã¹ÜÀí£¬²»±ØÔÚÎļþ¼Ðsrc/test/javaºÍsrc/test/resourcesÎļþ¼ÐÖ®¼äÇл»£¬¿ÉÒÔÔÚpom.xmlµÄ

<testResources>
<testResource>
<directory>src/test/java</directory>
<excludes>
<exclude>**/*.java</exclude>
</excludes>
</testResource>
</testResources>

·þÎñ¶ËÄ£Äâ

ΪÁËÑÝʾREST API£¬ÎÒÃÇʹÓÃWireMock·þÎñÆ÷

ÔÚpom.xmlÖÐÌí¼Ómock·þÎñÒÀÀµÅäÖÃ

<dependency>
<groupId>com.github.tomakehurst</groupId>
<artifactId>wiremock-standalone</artifactId>
<version>2.18.0</version>
<scope>test</scope>
</dependency>

±àдһ¸öÆô¶¯·þÎñµÄÀà

package server;

import com.github.tomakehurst.wiremock.WireMockServer;

import static com.github.tomakehurst.wiremock.client.WireMock.*;

public class StartServer {

private static WireMockServer wireMockServer = new WireMockServer(8080);

public static void startServer(){
wireMockServer.start();

stubFor(
get(urlEqualTo("/user/get"))
.willReturn(aResponse()
.withStatus(200)
.withHeader("Content-Type", "application/json")
.withBody("{ \"id\": \"1234\", name: \"John Smith\" }")));

stubFor(
post(urlEqualTo("/user/create"))
.withHeader("content-type", equalTo("application/json"))
.withRequestBody(containing("id"))
.willReturn(aResponse()
.withStatus(200)
.withHeader("Content-Type", "application/json")
.withBody("{ \"id\": \"1234\", name: \"John Smith\" }")));

}

public static void main(String... args){
startServer();
}
}

ÓÃÀýÎļþ±àд

Ò»¸öÓÃÀýÎļþÒÔ¡° .feature¡±À©Õ¹Ãû±£´æ¡£

ÎļþÒÔFeature¹Ø¼ü×Ö¿ªÍ·£¬ÔÚͬһÐиú×ÅËù²âÊԵŦÄÜÃû³Æ

Ò»¸öÓÃÀýÎļþ°üº¬²»Í¬µÄ²âÊÔ³¡¾°£¬Ã¿¸ö³¡¾°¶¼ÒԹؼü×ÖScenario¿ªÍ·£¬²¢ÇÒ°üº¬¶à¸ö²½Öè¡£ÕâЩ²½Öè°üº¬¹Ø¼ü×ÖGiven£¬When£¬Then£¬AndºÍBut

ÓйØCucumberºÍGherkin½á¹¹µÄ¸ü¶àÐÅÏ¢£¬Çëµã»÷´Ë´¦

Feature: Learn How to use Karate for testing.

Scenario: Testing valid GET endpoint

Given url 'http://localhost:8080/user/get'
When method GET
Then status 200

Scenario: Testing the exact response of a GET endpoint

Given url 'http://localhost:8080/user/get'
When method GET
Then status 200
And match $ == {id:"1234", name:"John Smith"}

Scenario: Testing that GET response contains specific field

Given url 'http://localhost:8080/user/get'
When method GET
Then status 200
And match $ contains {id:"1234"}

RunnerÀà±àд

½¨Òé·ÅÔÚÓÃÀýÎļþͬ¼¶Ä¿Â¼ÏÂ

ÎÒÃÇ¿ÉÒÔͨ¹ý½«KarateÓëJUnit¼¯³ÉÀ´ÔËÐÐÎÒÃǵIJâÊÔ

ÎÒÃǽ«Ê¹ÓÃ@CucumberOptions×¢½âÖ¸¶¨FeatureÎļþµÄ¾ßÌåλÖÃ

package demo;

import com.intuit.karate.junit4.Karate;
import cucumber.api.CucumberOptions;
import org.junit.runner.RunWith;


@RunWith(Karate.class)
@CucumberOptions(features = "classpath:demo/demo.feature")

public class DemoRunner {

}

ÔËÐÐÓÃÀý

1.ÏÈÆô¶¯·þÎñ

ÓÒ»÷StartServerÀàÑ¡ÔñRun StartServer.main()Æô¶¯·þÎñ

2.ÔËÐÐÓÃÀý

ÓÒ»÷DemoRunnerÀàÑ¡ÔñRun DemoRunnerÔËÐвâÊÔ

²é¿´±¨¸æ

ÔÚÏîÄ¿µÄtarget/surfire-reportsĿ¼ÏÂÓÐTEST-demo.demo.htmlÎļþ£¬ä¯ÀÀÆ÷Öдò¿ª¼´¿É¿´µ½½á¹û

³ÖÐø¼¯³É

¿ÉÒÔ½èÖúÓÚjenkinsÍê³É×Ô¶¯»¯²âÊÔ²¢ÇÒjenkinsÌṩ²å¼þcucumber-reports¿ÉÒÔչʾ¿É¶ÁÐÔÇ¿µÄ×Ô¶¯»¯²âÊÔ±¨¸æ

ÐèÒªÐÞ¸ÄRunner¼Ì³ÐKarateRunner£¬ÏÈÒýÈëKarate-testngÒÀÀµ

<dependency>
<groupId>com.intuit.karate</groupId>
<artifactId>karate-testng</artifactId>
<version>0.8.0</version>
</dependency>

ÐÞ¸ÄDemoRunner£¬×¢ÒâÅäÖÃCucumberOptions£¬Òª²úÉújson¸ñʽµÄ±¨¸æ£¬cucumber-reports²å¼þ»áÈ¥½âÎö¸ÃÎļþ²¢Éú³É±¨¸æ

package demo;

import com.intuit.karate.junit4.Karate;

import com.intuit.karate.testng.KarateRunner;
import cucumber.api.CucumberOptions;
import org.junit.runner.RunWith;

@CucumberOptions(features = "classpath:demo/demo.

feature",format={"pretty",

"html:reports","json:report.json"})

public class DemoRunner extends KarateRunner {

}

jenkinsÖÐcucumber-reportsÅäÖÃÇë²Î¿¼ÍøÂç×ÊÔ´

jenkinsÅäÖÃÃüÁîÐÐÔËÐÐÖ¸Áî

rm -rf ${WORKSPACE}/report.json
cd /home/pateo/IdeaProjects/demo4karate
mvn test -Dtest=DemoRunner
cp report.json ${WORKSPACE}/report.json

jenkins±¨¸æÕ¹Ê¾

   
4029 ´Îä¯ÀÀ       29
Ïà¹ØÎÄÕÂ

΢·þÎñ²âÊÔÖ®µ¥Ôª²âÊÔ
һƪͼÎÄ´øÄãÁ˽â°×ºÐ²âÊÔÓÃÀýÉè¼Æ·½·¨
È«ÃæµÄÖÊÁ¿±£ÕÏÌåϵ֮»Ø¹é²âÊÔ²ßÂÔ
È˹¤ÖÇÄÜ×Ô¶¯»¯²âÊÔ̽Ë÷
Ïà¹ØÎĵµ

×Ô¶¯»¯½Ó¿Ú²âÊÔʵ¼ù֮·
jenkins³ÖÐø¼¯³É²âÊÔ
ÐÔÄܲâÊÔÕï¶Ï·ÖÎöÓëÓÅ»¯
ÐÔÄܲâÊÔʵÀý
Ïà¹Ø¿Î³Ì

³ÖÐø¼¯³É²âÊÔ×î¼Ñʵ¼ù
×Ô¶¯»¯²âÊÔÌåϵ½¨ÉèÓë×î¼Ñʵ¼ù
²âÊԼܹ¹µÄ¹¹½¨ÓëÓ¦ÓÃʵ¼ù
DevOpsʱ´úµÄ²âÊÔ¼¼ÊõÓë×î¼Ñʵ¼ù