มาใช้ Functional Testing กัน

1 Aug
2009

หลังจากที่ไป download grails มาจาก github เห็นว่ามี folder นึงที่น่าสนใจคือ grails-functional-tests คำถามแรกคือ มันคืออะไร ? เพราะว่าปกติทำแต่ unit test ธรรมดาทั่วไป

รูปจาก www.grails.org

ดังนั้นจึงไปทำการค้นหาพบว่า function test มันเป็น plugin ตัวหนึ่งของ Grails อยู่ที่นี่ Functional Test Plugin

และมีการเปรียบเทียบกับ WebTest ไว้ที่นี่

หลังจากที่ไปอ่านมา ได้ข้อสรุปคร่าวๆ ว่า Functional Test คือ
- plugin ของ grails
- HTTP Testing นั่นเอง โดยข้างในมันคือ HtmlUnit หรือตัวยิง web
- ใช้ DSL ของ groovy ซึ่งเป็นข้อดีและเข้ากันดี ไม่ต้องไปเขียน xml ให้ยุ่งยาก

พอรู้ถึงข้อมูลคร่าวๆ ของ Functional Test แล้วก็ถึงเวลานำมันมาใช้งานกันดีกว่า

จากตัวอย่าง ผมเลือก Upload File มาลองทดสอบดู

ปล. ผมจะไม่ copy มาตรงๆ แต่จะสร้างเองให้เหมือนกันเลย เพื่อความเข้าใจที่มาที่ไป …

เริ่มกันเลย

1. สร้าง project ชื่อ fileupload ด้วยคำสั่ง
>grails create-app fileupload

2. สร้าง Controller ชื่อว่า upload ด้วยคำสั่ง
>grails create-controller upload

จะสร้าง file /grails-app/controllers/UploadController.groovy ขึ้นมา แล้วเราไปแก้ไขดังนี้

class UploadController {

    def index = {}

    def testUpload = {
		def file = request.getFile("myFile")
		render "upload = ${file!=null}"
    }

}

3. สร้าง view ขึ้นมา โดยทำการสร้าง file ชื่อ index.gsp ใน folder /grails-app/views/upload/
เป็นหน้า form สำหรับ upload file จากผุ้ใช้งาน ดังนี้

<html>
    <head>
        <title>Welcome to Grails</title>
		<meta name="layout" content="main" />
    </head>
    <body>
       <g:uploadForm name="myForm" action="testUpload">
			<input type="file" name="myFile" /><br />
			<g:submitButton name="Upload"></g:submitButton>
		</g:uploadForm>
    </body>
</html>

4. ถึงเวลาพระเอกของเรา ทำการติดตั้ง Functional Test Plugin ด้วยคำสั่ง
>cd fileupload
>grails install-plugin functional-test

แต่อาจจะช้าไป แนะนำให้ไป download ที่นี่ มาเลย แล้วใช้คำสั่ง [ ผมนำมาไว้ที่ drive c:\ ]
>grails install-plugin c:\grails-functional-test-1.2.7.zip

ผลการติดตั้ง จะสร้าง folder /test/function ขึ้นมา ดังรูป

5. สร้าง class สำหรับทำ Function Test ชื่อ FileUpload ด้วยคำสั่ง
>grails create-functional-test FileUpload

จะสร้าง file ชื่อ FileUploadFunctionalTests.groovy ขึ้นมา แล้วเราไปแก้ไขดังนี้

class FileUploadFunctionalTests extends functionaltestplugin.FunctionalTestCase {
    void testUploadFile() {
        get('/upload/index')
        assertStatus 200

		form('myForm') {
		  myFile.data = "some text".bytes
		  myFile.contentType = "text/plain"
		  click "Upload"
		}		

        assertStatus 200
        assertContentContains "upload = true"
    }
}

คำอธิบาย
- get(’/upload/index’) ทำการยิงไปที่ file /grails-app/views/upload/index.gsp ด้วย HTTP GET
- assertStatus 200 ตรวจสอบว่า Response code เป็น 200 หรือไม่
- ทำการจำลองข้อมูลที่ใส่ไปใน form ก็คือ binary ที่จะส่งไป และทำการ submit ไป
- assertContentContains “upload = true” ตรวจสอบข้อมูลที่ return กลับว่าว่าเป็น “upload = true” หรือไม่

6. ทำการทดสอบ functional test ด้วยคำสั่ง
>grails functional-tests

ผลการทำงานแสดงดังรูป

และจะทำการสร้างรายงานของการทดสอบไว้ที่ folder /test/reports ของ project นั่นเอง ซึ่งมีทั้งแบบเป็น text และ html สวยงาม ผมเอาตัวอย่างของ html มาให้ดูดังรูป

7. เพิ่มเติม จากตัวอย่างการใช้งานนั้น มีการทดสอบยิง web Twitter ด้วย ดังนี้

class TwitterTests extends functionaltestplugin.FunctionalTestCase {
	void testSearch() {
		get('http://www.twitter.com')
		click "Search"
		assertStatus 200 assertContentContains "search"
		form('searchForm') {
			q = "#grails"
			click "Search"
		}
		assertStatus 200 assertContentContains "#grails"
	}
}

สรุปได้ว่าเจ้าตัว functional test plugin มันก็คือ ตัวเอาไว้ยิงระบบ web ที่เราต้องการนั่นเองครับ แถมมี report มาให้ด้วย ซึ่งเหมาะสมที่จะเอามาช่วยตรวจสอบความถูกต้องในการทำงานและประสิทธิภาพของ ระบบอีกด้วยครับ

ของมันน่าใช้เลยเอามาบอกต่อครับ

รู้สึกบทความเรื่อง testing ใน grails ยังไม่ค่อยมีเท่าไร ดังนั้นจะพยายามหาและเขียนบทความของการทำ Unit Testing และ Integration Testing เบื้องต้นมาฝากในโอกาสต่อไป

สำหรับผู้ที่สนใจเรื่องของ Grails สามารถเข้าแวะชมเพิ่มเติมได้ที่ Grails66 >> http://www.grails66.com/blog/

9 Responses to มาใช้ Functional Testing กัน

Avatar

Nick

August 1st, 2009 at 10:58 am

Functional Test ตัวนี้ เป็น เทส Application แบบไหนครับ สงสัย

Avatar

พี่อิ๋ว

August 1st, 2009 at 12:59 pm

รบกวนช่วยอธิบาย ความเป็นมาได้ไหมคะ อ่านแล้วยัง งง อยู่ค๊า

Avatar

up1

August 2nd, 2009 at 8:53 pm

ในการใช้งาน functional testing นั้นจะมาความเป็นมาดังนี้ครับ

ขั้นที่ 1 จะเป็นการทำ unit testing ในแต่ละส่วนของ code ในระบบก่อน

ขั้นที่ 2 จะเป็นการทำ integration testing เป็นการทดสอบระบบโดยรวม ซึ่งจะรวมแต่ละ unit test มาทดสอบด้วย env ของระบบโดยรวมครับ

ขั้นที่ 3 จะเป็นการทำ functional testing ซึ่งเหมือนเป็นการจำลองการใช้งานของผู้ใช้งาน จากตัวอย่างจากบทความ จะเป็นการทดสอบการ upload file โดยจะจำลองตั้งแต่
- เข้ามาในหน้า upload form
- ทำการเลือก file และกดปุ่ม submit
- แล้วจะได้ผลการทำงานออกมา ว่าเป็นไปตามผลลัพธ์ที่คาดหวังหรือไม่

การใช้ functional testing [ ใช้ HTTPUnit ซึ่งเน้นทดสอบระบบที่เป็น Web Application ] นี้ทาง programmer/developer มักจะไม่ค่อยเห้นความสำคัญมากเท่าไร เนื่องจากสามารถทดสอบจากระบบหรือจาก browser ได้จะสะดวกกว่า แต่ถ้าในส่วนของคนรวม code เพื่อ deploy เพื่อทดสอบระบบแล้วถือว่าสำคัญมากๆ พอๆ กับ unit และ integration testing

functional testing นั้นสามารถนำมาใช้เพื่อใช้วัดทั้ง
- ความถูกต้องของการทำงาน
- วัดประสิทธิภาพของการทำงานในแต่ละระบบ
- วัดเรื่อง Usability ของระบบ ยิ่งออกแบบ functional testing ได้ยากเท่าไรเรื่อง Usability ของ web ก็ยิ่งต่ำมากครับ เพราะว่าเป็นมุมมองจากผู้ใช้งาน

น่าจะพอเห็นภาพนะครับ หรือจะยิ่งงงไปอีกหว่า …. อิอิอิอิ

จากบทความนี้ผมพยายามให้เห้นแบบ high level ก่อนครับ แล้วจะลงมาที่ unit testing และ integration testing ซึ่งจะเป็นมุมมองที่สะท้อนให้เห็นว่า คนพัฒนาระบบมองระบบเป็นยังไงบ้าง

Avatar

Jahae

August 5th, 2009 at 10:03 am

น่าสนใจนะครับ แต่ว่าขออ่าน help ก่อนดีก่า ยังงงๆ อยู่ครับใช้ไม่เป็น อยากรู้ว่ามันสามารถ simulate UDP & TCP ได้ป่าวแบบยิง protocal น่ะ ตอนนี้ใช้ tools ที่เขียนเองอยู่ยิงได้แต่วัด performance ไม่ได้อ่าครับ มีคำแนะนำ ช่วยบอกผมทีนะครับ ขอบคุณครับ

Avatar

up1

August 5th, 2009 at 11:19 am

ถ้าสนใจตัวนี้ผมแนะนำข้อมูลเพิ่มเติมที่นี่ครับ
http://httpunit.sourceforge.net/

Avatar

up1

August 5th, 2009 at 6:03 pm

ผมมาแนะนำ website รวม opensource testing tool ครับ ที่นี่เลย แจ่มใช้ได้
http://www.opensourcetesting.org

Avatar

Pao

August 9th, 2009 at 6:40 pm

สอบถามหน่อยนะครับ เท่าที่ผมเข้าใจ (ไม่รู้ว่าเข้าใจถูกหรือป่าว) ว่า Grails เป็น tool ที่ใช้ Test พวก Application ที่เป็น web ถูกต้องมั้ยครับ แล้วเจ้าตัว Application นี้ต้องเป็น Application ที่เขียนโดย IDE พวก JAVA, Net Bean, พวกนี้ใช้หรือ่ปาว แล้วไม่ทรายว่า Application ที่สร้างมาจาก IDE พวก VS.net มี tool อะไรที่ใช้ในการ Test บ้างครับ พอดีกำลังได้งานเป็น Application Tester ยังไม่ค่อยมีความรู้เรื่องนี้สักเท่าไร ขอคำแนะนำด้วยครับ ขอบคุณครับ

Avatar

up1

August 9th, 2009 at 7:04 pm

ตอบคุณ Pao

Grails คือ Framework ตัวหนึ่งครับ ใช้ในการพัฒนา Web Application โดยจริงๆ แล้วนั้น Grails จะทำงานอยู่บน Spring Framework และ Hibernate [ สามารถเปลี่ยนได้ ] ครับ และสุดท้ายก็แปลงมาเป็น bytecode

Grails ก็จะมี testing tools apis พ่วงมาด้วย จะเหมือนในภาษา java หรือ framework อื่นๆ ที่เขียนด้วย java เช่น unit testing, integration testing, functional testing

ส่วน IDE และ Edotor นั้นสามารถใช้ tools อะไรก็ได้ ที่สนับสนุนครับ ตัวอย่าง Grails ผมใช้ notepad, editplus, netbeans, eclipse เป็นต้น

โดย IDE ส่วนใหญ่จะมี testing มาให้เล็กน้อยคือ Unit Testing มาให้ครับ

ส่วน testing tools อื่นๆ ต้องหามาเพิ่มครับ ผมแนะนำที่นี่ครับ มีหลายตัวให้เลือกใช้
http://java-source.net/open-source/testing-tools

Avatar

Pao

August 9th, 2009 at 9:44 pm

ขอบคุณมากครับ คุณ up1 เด๋วจะพยายามหาข้อมูลเพิ่มเติมครับ ยังไงก็ขอบคุณมากครับ

Comment Form

top