Play框架中已經集成了junit框架,你們能夠很是方便的進行功能測試,這裏我展示一個測試新增的例子,其餘的你們能夠照這個例子深刻。 首先須要在app/modules包中定義一個Beat類,app/controllers中定義一個控制器Beats,同時須要定義個被測試的方法,並在conf/routes配置該方法的url地址,分別以下: app/modules/Beat.java:java
package models; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Table; import play.db.jpa.GenericModel; @Entity @Table(name = "beat") public class Beat extends GenericModel { @Id public Long id; public String words; public Long count; public Long attime; }
app/controllers/Beats.java:數據庫
package controllers; import play.db.jpa.JPABase; import play.mvc.Controller; import models.Beat; public class Beats extends Controller{ public static void add(Beat beat){ boolean result = beat.create(); renderText(result); } }
conf/routes片斷:mvc
POST /beat Beats.add
Play中用yaml格式文件做爲測試的數據存儲。也提供了相應的解析方法。這裏咱們將測試的數據分紅兩部分,一部分用做模擬數據庫數據,程序啓動的時候,會將這部分數據加載到內存數據庫中。另外一部做爲請求的數據,每次請求的時候會用到。對應的會有兩個yaml文件,test/yml/db/beat.yml 和 test/yml/request/beats.yml。 test/yml/db/beat.yml:app
Beat(b1): id: 1001 words: this is a happay word count: 0 Beat(b2): id: 1002 words: preo jobs count: 2
test/yml/request/beats.yml:框架
add_normal: beat.id: '1003' beat.words: third feel is unok beat.count: '0'
這樣咱們就能夠進行功能測試,功能測試類必須繼承FunctionalTest,繼承以後就可使用play給咱們預置的各類assert方法,還有junit的註解標籤。如:test/function/BeatsTest.java。內容:測試
package function; import java.util.Map; import models.Beat; import org.junit.Before; import org.junit.Test; import play.db.jpa.JPA; import play.mvc.Http.Response; import play.test.Fixtures; import play.test.FunctionalTest; public class BeatsTest extends FunctionalTest{ Map allRequstMap =null; @Before public void init(){ allRequstMap = (Map)Fixtures.loadYamlAsMap("yml/request/beats.yml"); if(!JPA.em().getTransaction().isActive()){ JPA.em().getTransaction().begin(); } Fixtures.delete(Beat.class); Fixtures.loadModels("yml/db/beat.yml"); JPA.em().getTransaction().commit(); } @Test public void testAdd(){ int beforeRequestSize = Beat.findAll().size(); Map map = allRequstMap.get("add_normal"); Response response = POST("/beat", map); assertIsOk(response); int afterRequestSize = Beat.findAll().size(); assertEquals(beforeRequestSize, afterRequestSize - 1); Beat beat = Beat.findById(Long.parseLong(map.get("beat.id"))); assertNotNull(beat); String result = response.out.toString(); assertFalse("null".equals(result)); assertEquals("true", result); } }
每次執行@Test方法時,都要先執行init,在init方法中,Fixtures加載解析yaml文件。分別將兩個yml文件放入map與內存數據庫中。 在testAdd中,使用了FunctionalTest預置的POST發起請求,固然還有其餘如PUT/GET/DELETE方法,FunctionalTest也預置的許多assert方法,方便你們的使用,你們能夠本身查看API或者源碼。this