iT邦幫忙

DAY 18
5

邊看邊學Groovy/Grails/Gradle系列 第 15

Grails-建立Domain Clas及簡易Integration Test

接下來到鐵人賽結束會跟大家分享的內容皆來自於以下這兩本書:

但我以第一本的範例為主(個人偏好Manning的書),筆者以1個Microblog為例,介紹從無到有,基本上我也是邊看邊學,故說老實話,我會follow書裡面的步驟一步一步來,我也是變數名稱改一改,網頁layout/圖面,參加IT鐵人賽主要對我來說是學習Grails如何快速開發一個網站。
昨天忘記一提,所有相關Grails的設定黨都在conf目錄底下,而不難發現,其實Grails底層也是納入Spring以及Hibernate知名的java framework,Grails利用Groovy Dynamic features幫我們作好很多coding以及complied into bytecode的動作,更讓人感到欣慰的是沒有出現spring或是Hibernate等的XML組態設定檔,全部都是用Groovy包起來了

今天介紹如何建立Domain Class以及簡單的Integration Test

在建立Domain class之前要先討論一個話題就是型別(type and untyped),雖然Groovy屬dynamic language,並無強調一定要宣告型別,但對於Domain class來,各個屬性最好是指定型別以便未來作GORM(Groovy ORM),除非該屬性不須persist到資料庫裡可以用def宣告,一般而言需persist到database的屬性需宣告型別,以下是第一個Domain class,在GGTS上新增->Domin Class

package com.JasonMicroBlog

class User {
	String userId //每個屬性最好宣告欄位
	String password
	String personalPage
	Date dateCreated
	
    static constraints = { 
		//各欄位的限制條件,用來作Validation
		userId blank :false, unique:true //不允許空白且唯一
		password size: 6..8 //密碼介於6到8個字元
		personalPage url: true //必須是網址
    }
}

Domain class說穿了就是GroovyBean而已...簡潔版的JavaBean....

再來書中示範在還沒有設定database相關設定前,筆者推薦用Integration Test測試我們寫的code是否work

關於Integration Test筆者推薦Spock framework來協助而非使用Grails內建的(應該是)JUnit吧?

首先我們需要把安裝spock plugin

先到conf目錄底下->打開BuildConfig.groovy檔案,此檔案是用來管理Dependency以及plugin的

請找到dendencies將spock的名稱打入,如下

dependencies {
        // specify dependencies here under either 'build', 'compile', 'runtime', 'test' or 'provided' scopes e.g.
		test "org.spockframework:spock-grails-support:0.7-groovy-2.0"
        // runtime 'mysql:mysql-connector-java:5.1.22'
    }

再到plugins下,因為spock屬test function,插入以下code

test(":spock:0.7") {
			exclude "spock-grails-support"}

再來,請在該檔案上按右鍵->Grails Tools->Refresh Dependencies,如下圖

GGTS則會開始下載以及build spock dependeny

這些都完成後,接下來新增一Integration Test模擬

  1. 新增一筆紀錄
  2. 檢查欄位

每一個void方法都代表一個測試unit,名稱可自取

1.第一個測試unit-"Saving our First user to the database"

	void "Saving our First user to the database"() { //測試unit  
		given: 'A New Registered User'
		//測試名稱
		def jason= new User(userId:'Jason', password:'JasonGoo',
	    personalPage:'https://www.facebook.com/NeverFigureOut')
		
		when: "the user is saved" //執行什麼樣的測試
		jason.save()
		
		then: 'it persisted to database successfully!' 
		//預期測試結果,撰寫code測試是否通過測試
		jason.errors.errorCount ==0 //有沒有錯誤
		User.get(jason.id).userId ==jason.userId 
		//檢查新增的使用者是否等於前面宣告的使用者
	}

2.檢查欄位

void "Validating User Input"(){
		given: 'Validate Columns'
		
		def user =new User(userId:'Jason', passward:'X79',
			personalPage:'I do not have homepage')
		
		when:
		user.validate()//執行檢查欄位
		
		then:
		user.hasErrors()//如果有errors的話
		
		
		"unique"==user.errors.getFieldError("userId")
		//每個限制條件都有對應之ErrorMessage,詳細需查API
		"size.toosmall"==user.errors.getFieldError("passward")
		"url.invaild"==user.errors.getFieldError("personalPage")	
	}

完成後,run app-test

執行結果:

結果在第二項欄位測試時fail了,還可以點選report來看

簡單說就是密碼太短了,與Domain Class的欄位限制衝突,測試沒過,需要修正

另外整個Integration Test Code還有兩個方法def setup(), def Cleanup()目前沒用到,若有介紹再行分享

明天繼續介紹如何實現1對1、1對多及多對多在Grails如何實現


上一篇
建立Grails安裝開發環境
下一篇
Grails-如何建立在Domain class中建立物件關係以及Scaffolding
系列文
邊看邊學Groovy/Grails/Gradle27

尚未有邦友留言

立即登入留言