±à¼ÍƼö: |
±¾ÎÄÀ´×ÔÓÚ¸öÈË΢²©£¬ÔÚÕâÆªÎÄÕÂÖУ¬ÎÒÃǽ«½éÉÜһϿªÔ´µÄ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±¨¸æÕ¹Ê¾
|