Upload
-
View
352
Download
2
Embed Size (px)
Citation preview
CPE4235 การวเคราะหและโปรแกรมเชงวตถ
จตกร พทกษเมธากลJava Web Developer @Geniustree Co.,Ltd“i am programmer.”
ถาคดแลวไมไดท า เทากบไมไดคดเสนบางๆ ระหวางความจรงกบความฝน
คอ “การลงมอท า”
CPE4235
ทบทวน
CPE4235
• class, abstract class, interface• object• attribute• method
• this, static• package , import• OOP
• Encapsulation• Inheritance• Polymorphism
CPE4235
Annotation, Wrapper Class, Enum Type and Unit Test
CPE4235
4
เนอหา
• Annotation• Java Reflection• Enum Type• Wrapper Class• Unit Test
CPE4235
enum
@
test
CPE4235
Annotation
CPE4235
เราอาจจะเคยเหน
@Override@Entity@Table@Column@Autowired@....
อนนแหละทเขาเรยกวา Annotation
CPE4235
Annotation คอ Configuration บน Java Source Codeมไวส าหรบเกบ Meta Data ของสงทถกประกาศไว
CPE4235
เชน
@Entity@Table(name=“os_user”)public class User implements UserDetails {
@Id@Column(length = 50)private String username;@Overridepublic String getUsername( ){ return username; }
}
CPE4235
จากตวอยาง
เราใช Annotation ในการอธบาย / เกบ configuration ของ class field และ method
วา class นน field นน หรอ method นนเปนอะไร ม meta data อะไรถกนยามไวบาง
CPE4235
Annotation เรมมการใชครงแรกใน Java 5
ปญหาทท าใหตองม Annotation คอปกต เวลาทเราจะเกบ configuration อะไรสกอยาง เรามกจะเกบลงใน xml file
ทวา เมอระบบ หรอ code มขนาดใหญขน กท าใหการอาน config จาก xml มความล าบาก และวนวายยงขน
CPE4235
เขาจงไดคดคน Annotation ขนมา เพอเอา configuration มาเกบลงใน Java Source Code เลย
เพอลดความยงยาก และความซบซอนในการอาน xml
CPE4235
Annotation จะม @ น าหนา เชน @Override
สามารถใชไดกบทง • class, interface• field (attribute) • method• package• parameter• constructor• …
CPE4235
เราสามารถสราง Annotation ขนมาใชงานเองไดโดยการประกาศ interface ทม @ น าหนา ดงน
เชน เราจะสราง @Column (name = “”, pattern = “”)
public @interface Column {
}
CPE4235
จากนน ก าหนดวาจะใหใช @Column บนอะไรไดบางเอาไปใชทจดไหนของ Java source code(class, field, method, …) ดวย @Taget
@Taget(ElementType.FIELD)public @interface Column {
}
CPE4235
ถาหลายอนเราจะใช @Target(value = { … }) เชน
@Target(value = {ElementType.FIELD, ElementType.METHOD
}) public @interface Column {
}
CPE4235
@Taget ElementType สามารถเปนไปได 8 คา ดงน
• TYPE – Class, interface (annotation ), or enum declaration • FIELD - Field declaration (includes enum constants) • METHOD - Method declaration• PARAMETER - Parameter declaration• CONSTRUCTOR - Constructor declaration• LOCAL_VARIABLE - Local variable declaration• ANNOTATION_TYPE - Annotation type declaration• PACKAGE - Package declaration
CPE4235
จากนน ก าหนดวา Annotation นจะถกใชงานหรอมองเหนในระดบใด ดวย @Retention
@Retention(RetentionPolicy.RUNTIME)@Taget(ElementType.FIELD)public @interface Column {
}
CPE4235
ถกใชงานหรอมองเหนในระดบใด หมายถงAnnotation นนเอาไวใชท าอะไร เมอไร (ณ ชวงเวลาใด)
เชน
เปน Annotation ส าหรบตรวจสอบขอมลตอน Compile timeหรอเปน Annotation เอาไวประมวลผลขอมลตอน Run timeหรอเปน Annotation ทเอาไวใชเฉพาะใน Source code เทานนเปนตน
CPE4235
@Retention RetentionPolicy สามารถเปนไปได 3 คา ดงน
• SOURCE – ใชไดในระดบ Source code เทานน ไมสามารถท างานทเวลา Compile time และ Run time ได
• CLASS – ใชไดในระดบ Source code และ Compile time แตไมเหนตอน Run time
• RUNTIME – ใชไดทง Source Code, Compile time และ Run time
CPE4235
จากนน ก าหนด method ของ @Column (name = “”, pattern = “”)
@Retention(RetentionPolicy.RUNTIME)@Taget(ElementType.FIELD)public @interface Column {
String name( );String pattern ( );
}
CPE4235
เราสามารถก าหนดคา default ได ดวย “default” keyword
@Retention(RetentionPolicy.RUNTIME)@Taget(ElementType.FIELD)public @interface Column {
String name( ) default “”;String pattern ( ) default “dd/MM/yyyy”;
}
CPE4235
Java Reflection
CPE4235
Reflection = เงาสะทอน
เวลาทเราสองกระจกใส เรากจะเหนเงาสะทอนของตวเองเราจะรวาหนาตาตวเองเปนยงไง ปาก คว จมก ตา หของเราเปนยงไง
CPE4235
Java Reflection กเหมอนกนเปนสงทสะทอนถง Class นนๆ วามหนาตาเปนยงไง
CPE4235
Java Reflection
เปนวธการเขยนโปรแกรมเพอดหนาตาของ class (****)วา class นนๆ หนาตาเปนยงไง
เปนการดหนาตาแบบ dynamic คอใชการเขยนโปรแกรมเพอตรวจเชคหนาตาใหเอง
*** รวมทง interface, annotatoin, enum ….
CPE4235
เชน
• เราอยากรวา class นน มชอวาอะไร• อยากรวา class นนมชอเตมวาอะไร (ชอ + package) • อยากรวา class นนม Annotation อะไรบาง• อยากรวา class นน extends มาจาก class อะไร• อยากรวา class นน implements interface อะไรบาง• อยากรวา class นนม method อะไรบาง• อยากร...
CPE4235
เชน
• อยากเรยก method ของ class นนแบบ dynamic• อยาก set คาลง method แบบ dynamic• อยากดง (get) คาจาก method แบบ dynamic• …
CPE4235
เราอยากรวา class นน มชอวาอะไร
package com.pamarin.chapter4;import java.io.Serializable;public class Staff implements Serializable {
public static void main(String[] args) {//StaffSystem.out.println(Staff.class.getSimpleName());
}}
CPE4235
อยากรวา class นนมชอเตมวาอะไร (ชอ + package)
package com.pamarin.chapter4;import java.io.Serializable;public class Staff implements Serializable {
public static void main(String[] args) {// com.pamarin.chapter4 .StaffSystem.out.println(Staff.class.getName());
}}
CPE4235
อยากรวา class นน extends มาจาก class อะไร
package com.pamarin.chapter4;import java.io.Serializable;public class Staff implements Serializable {
public static void main(String[] args) {// java.lang.ObjectSystem.out.println(Staff.class.getSuperclass().getName());
}}
CPE4235
อยากรวา class นน implements interface อะไรบาง
package com.pamarin.chapter4;import java.io.Serializable;public class Staff implements Serializable {
public static void main(String[] args) {// java.io.Serializablefor(Class clazz : Staff.class.getInterfaces()){
System.out.println(clazz.getName());}
}
CPE4235
อยากรวา class นนม method อะไรบาง
package com.pamarin.chapter4;import java.io.Serializable;import java.lang.reflect.Method;public class Staff implements Serializable {
public static void main(String[] args) {// mainfor(Method method : Staff.class.getDeclaredMethods()){
System.out.println(method.getName());}
CPE4235
Get คาจาก method
public class Reflect {public static void main(String[] args) throws Exception {
Reflect reflect = new Reflect();Method method = reflect.getClass().getMethod("getName");System.out.println("name --> " + method.invoke(reflect));
}
public String getName(){ return "reflection"; }}
CPE4235
Set คาลง method
public class Reflect {public static void main(String[] args) throws Exception {
Reflect reflect = new Reflect();Method method = reflect.getClass()
.getMethod("setName", String.class);method.invoke(reflect, "reflect");
}public void setName(String name){
System.out.println("set --> " + name); //set --> reflect}
CPE4235
เมอเรารหนาตาของมนแลวเราเอามาใชท าอะไร?
CPE4235
การเขยนโปรแกรมบางอยาง เราอาจจะไมทราบลวงหนา วาเราตองเขยน code ใหท างานกบ class field หรอ method อะไรบาง
CPE4235
เราตองการเขยนโปรแกรมเผออนาคตอยากใหโปรแกรมมนตรวจสอบใหเองโดยอตโนมต
ไมวาเราจะสงขอมลอะไรเขาไปกตาม
CPE4235
เชน การเขยนโปรแกรม เพอแปลงขอมลจาก java class ไปเปน database table ทเราไมรวา โปรแกรมเมอรจะก าหนด field database เปนอะไรบาง เรากใช java reflection ชวยตรวจสอบให
CPE4235
หรอเราตองการเขยนโปรแกรมเพอแปลงขอมลจาก excel ไปเปน java object
เราไมรวาผใชจะก าหนดหว excel มาเปนอะไรบางและเราจะตองสราง class อะไรเพอรองรบ excel นน
เรากใช java reflection เพอชวยในการตรวจสอบ และแปลงใหเปนตน
CPE4235
มาดตวอยางจรงๆ กนดกวาจากโปรเจคน
https://github.com/jittagornp/excel-object-mapping
CPE4235
Enum Type (Enumeration)
CPE4235
เวลาทเราเขยนโปรแกรมการก าหนดคาตวแปร จะตองเปนไปตาม Type หรอชนดขอมล นนๆ เชน
int – จะมคาเปน 0, 1, 2, 3boolean – จะมคาเปน true, falsechar – จะมคาเปน ‘A’, ‘B’, ‘C’, ‘D’
เปนตน
CPE4235
ตอนเขยนโปรแกรม กเลยมกจะเจอ เงอนไขลกษณะน
int condition = …if(condition == 1){
…} else if (condition == 2){
…} else if (condition == 3){
…} else if …
CPE4235
หรอแบบน
char condition = …if(condition == ‘S’){
…} else if (condition == ‘M’){
…} else if (condition == ‘T’){
…} else if …
CPE4235
Code มนไมคอยจะสอความหมายเทาไหรนะ
1 คออะไร ? ‘S’ คออะไร ?2 คออะไร ? ‘M’ คออะไร ?3 คออะไร ? ‘T’ คออะไร ?
เสยเวลาอาน + ไลด code
CPE4235
บางครง เรากตองการคาตวแปรทมนสอความหมายมากกวาท primitive data type จะใหได
CPE4235
เขากเลยแกปญหา โดยการใช String เพอใหมนมความหมายของ code มากกวาเดม
ดงน
CPE4235
แก code ใหม
String condition = …if(“SUNDAY”.equals(condition)){
…} else if (“MONDAY”. equals(condition)){
…} else if (“TUESDAY”. equals(condition)){
…} else if …
CPE4235
ดแลวงายขน รทนทวา code ตองการสอความหมายวาอยางไร
CPE4235
แต!
CPE4235
มนกยงเปนปญหาอย ด
ปญหาอะไรหรอ?
แลวถาสมมตวาเราพมพ ค าวา TUESDAY ผดละจะเกดอะไรขน
แนนอน มนไมมทางเขาเงอนไข นนแนๆเพราะเราสะเพรา พมพผดเอง (Bug Programmer)
CPE4235
เขากเลยแกปญหาใหมอกท ดวยการก าหนดเปน static final
public class Days {public static final String SUNDAY = “SUNDAY”;…
}
if(Days.SUNDAY.equals(condition)){
}
CPE4235
มนก OK ขนนะ work เลยแหละแตมนตดอยอยางนง
ตวแปร Days.SUNDAY มนไมม พฤตกรรม (method) ทเราตองการ เพราะวามนเปน String เราใชไดแค method ทเปนของ String เทานน
เอาไงดละ? มนไมครบตามทเราตองการอะ
CPE4235
ทางออก คอ Enum Type
เราจะเปนคนก าหนดชนดขอมลขนมาใชงานเองขอมลทมคาเปน• SUNDAY • MONDAY• TUESDAY• …
เปนตวขอมลจรงๆ เลย ไมใช String นะ
CPE4235
การประกาศ enum
public eum Days { //ม 7 คาทเปนไปไดSUNDAY,MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY
}
CPE4235
ตอนนเราม enum Days มาใชงานเองละ ลองแก code เดมใหม
Days condition = …if(condition == Days.SUNDAY){
…} else if (condition == Days.MONDAY){
…} else if (condition == Days.TUESDAY){
…} else if …
CPE4235
สอความหมาย เหมอนทใช String
และทส าคญ คอไมมทางพมพผดดวยเพราะถาพมพผด Code จะ Compile ไมผานบวกกบมพฤตกรรม (method) ในตว
Work โคตร!!!
CPE4235
เราสามารถก าหนด Attribute และ Method ให enum ได ดงน
public eum YesNo{YES(“ใช”),NO(“ไมใช”);private final String description;private YesNo(String desc){
description = desc;}public String getDescription(){ return description; }
}
CPE4235
วธใช
YesNo answer = …if(answer == YesNo.YES){
…}
System.out.println(YesNo.YES.getDescription()); //ใชSystem.out.println(YesNo.NO.getDescription()); //ไมใช
CPE4235
เราจะใช enum กตอเมอ
เราตองการก าหนด Type เฉพาะขนมาเองเราตองการคาทมนสอความหมาย มากกวา 0, 1, A, B, C
และเรากตองการความมนใจ วาเราจะไมพมพผด(มคาถกตอง) + มพฤตกรรม (method) ในตว
CPE4235
Wrapper Class
CPE4235
OOP = การเขยนโปรแกรมเชงวตถ
แตขอมลบางอยางทมอย กลบไมเปนวตถ
หมายถงอะไร ?
CPE4235
Primitive Data type ยงไงละ ทไมเปนวตถ
int, float, double, char, boolean, byte, short, long
CPE4235
บางครงการเขยนโปรแกรม เราจ าเปนตองมการจดเกบขอมล หรอประมวลผลขอมลดวยวตถเทานน
เราไมสามารถใช Primitive Data Type มาด าเนนการได
CPE4235
เชน
การจดเกบขอมลลงใน Listท Java อนญาตเฉพาะขอมลทเปนวตถเทานน
แลวเราจะท ายงไงละ ถาเราอยากเกบขอมลตวเลขแตตวเลขไมใชวตถ
CPE4235
ดวยปญหาดงกลาว เขาจงคดหาทางแก ท าไมเราไมท าให Primitive มนเปนวตถซะละ
CPE4235
ม int กใหม Integer ทเปน class (วตถ) ของ int อกท หรอ ม float กม Float เปน class (วตถ) ของ float เชนกน
Integer กบ Float เราเรยกมนวา Wrapper Class
CPE4235
Wrapper Class ในทนหมายถง
class ทท าหนาทเปนตวหอหม Primitive Data Type
CPE4235
int Integerbyte Byteshort Shortlong Longfloat Floatdouble Doublechar Characterboolean Boolean
ฝงซายคอ primitive ฝงขวาคอ Wrapper class ของ primitive นนๆ
CPE4235
int number = 5; float number = 2.0F; boolean success = true;
กลายเปน
Integer number = new Interger(5);Float number = new Float(2.0F); Boolean success = new Boolean(true); หรอBoolean success = Boolean.TRUE;
CPE4235
Autoboxing vs Autounboxing
CPE4235
Autoboxing
เราสามารถแปลงคาจาก Primitive data type ไปเปน Wrapper class ของ ค Primitive นนไดโดยอตโนมต เชน
int number = 5; //ซงปกตจะเปน Integer numb = new Integer(number); //เราเรยกวา Boxing
เราสามารถเขยนแบบนไดInteger numb = number; //Autoboxing
CPE4235
Autounboxing
เราสามารถแปลงคาจาก Wrapper class ไปเปน Primitive data type ของ ค Wrapper class นนไดโดยอตโนมตเชนกน เชน
Integer numb = new Integer(5); //ซงปกตจะเปน int number = numb.intValue(); //เราเรยกวา Unboxing
เราสามารถเขยนแบบนไดint number = numb; //Autounboxing
CPE4235
แลวแบบนละไดมย ?
Integer numberObject = null;int nuber = numberObejct;
CPE4235
แลวแบบนละไดมย ?
Integer numberObject = null;int nuber = numberObejct;
ค าตอบคอไมได เพราะ int เปน null ไมได (int ไมใช Reference data type)
CPE4235
การทดสอบทางซอฟตแวร(Software Testing)
CPE4235
Software Testing เปนกระบวนการเพอชวยใหซอฟตแวรทพฒนา ม
• ความถกตอง• ความสมบรณ• ความปลอดภย และ• มคณภาพทด
CPE4235
Software Testing
เปนกระบวนการทดลองใช Software อยางมแนวทางโดยใชความรทางดานเทคนค (Technical)
CPE4235
เพอใหสามารถระบหรอคนหาความผดพลาด(Error) ของ Software ทอาจจะซอนอยใหปรากฏออกมา
และ สามารถระบถงแนวทางการเกดปญหา พรอมสมมตฐานของความผดพลาดทเกดขนได
CPE4235
แนวทางการทดสอบ
คอ การตงค าถามตอ Software เพอด าเนนการทดสอบและประเมนตว Software วาสามารถตอบค าถามทตงไวไดอยางถกตองหรอไม
CPE4235
แนวทางการทดสอบ
“ค าถาม” หมายถง เหตการณ (Event) หรอวธการทจะกระท ากบตว Software
เชน ถารบ input แบบนเขาไปแลว จะไดผลลพธเปนแบบนหรอไม
CPE4235
แนวทางการทดสอบ
“ค าตอบ” หมายถง ผลลพธของ Software ตอค าถามทเกดขน (ตรงตามทคาดหวงไวหรอไม)
CPE4235
คณภาพของซอฟตแวรทสามารถทดสอบได ไดแก
• reliability - ความนาเชอถอ• efficiency - ประสทธภาพ• portability - ความสามารถในการเคลอนยาย• maintainability - ความสามารถในการดแลรกษา• compatibility - ความสามารถเขากนได• usability - สามารถใชไดงายเขาใจไดงาย
CPE4235
รปแบบการทดสอบ
• Unit Test • Integration Test • System Test• Acceptant Test • Usability test
CPE4235
Unit Test
เปนการทดสอบหนวยทเลกทสด (unit) เปนการทดสอบฟงกชนการท างาน เพอยนยนวาฟงกชนนนท างานไดถกตอง ตามทเราคาดหวงไวหรอไม
เปนการทดสอบโดย Programmer ทเขยน Code นนๆ
CPE4235
Integration Test
เปนการทดสอบการเชอมตอสวนยอยๆ (Unit, Component หรอ Module) ทน ามาประกอบกน ใหได Software ทสมบรณ
เชน ModuleA เรยกใชงาน ModuleBหรอ Service หนงเรยกใชงานอก Service หนง ในระบบเดยวกน
ตย. การทดสอบการเชอมตอฐานขอมล หรอ Email
CPE4235
System Test
เปนการทดสอบการเชอมตอหรอตดตอสอสารกนระหวาง Software หรอระบบ (System) อนๆ
เชน เรามระบบ 2 ระบบทตองการใหท างานรวมกน หรอคยกน
CPE4235
Acceptant Test
เปนการทดสอบโดยผใช (End user) หรอโดยลกคา เพอดวาSoftware ท างานถกตองตามความตองการ (Requirement) หรอไม
CPE4235
Usability Test (User Experience Test)
เปนการทดสอบการใชงาน Software โดยผเชยวชาญสวนตอประสานกบผใช (UI/UX) วาใชงานไดงาย เขาใจไดงาย หรอไม
หรอเรยกอกอยางวาเปนการทดสอบประสบการณการใชงาน
CPE4235
Unit Test
CPE4235
Unit Test
• เปนการทดสอบหนวยทเลกทสด (unit) • เปนการทดสอบฟงกชนการท างาน เพอยนยนวาฟงกชนนน
ท างานไดถกตอง ตามทเราคาดหวงไวหรอไม
เปนการทดสอบโดย Programmer ทเขยน Code นนๆ
CPE4235
ในภาษา Java ม Framework ทชวยใหเราท าการทดสอบระดบUnit Test ทดงๆ และใชงานกนมากทสดคอJUnit และ TestNG
วนนเราจะใช JUnit กน
CPE4235
JUnit
คอ เครองมอทใชในการท า Unit Test ส าหรบภาษา Javaพฒนาโดย Kent Beck และ Erich Gamma
ตอนนกลายเปนมาตรฐานการท า Unit Test ของ Java ไปแลวIDE ดงๆ หลายตวไดผนวก JUnit เขามาตงแตตอนทท าการตดตง เชน Netbeans
CPE4235
หนาตาของ JUnit (เปน Java class ธรรมดาๆ ทม @Test)
import org.junit.Test;public class MyTest {
@Testpublic void test() {
//เขยน test code ตรงน (วาอยาก test อะไร)}
}
CPE4235
Method ทม @Test อยขางบน คอ method ทตองการทดสอบจากนไปขอเรยกวา Test Method หรอ Test Case
ซง Test Method (@Test) สามารถมกตวกได โดยปกตทกตวจะอสระจากกน คอ test ใคร test มน(Test ไมเปนล าดบ)
CPE4235
ตองการ Test วา 2 + 3 เทากบ 5 จรงหรอไม ?
import org.junit.Test;import static org.junit.Assert.*;public class MyTest {
@Testpublic void test() {
assertEquals(2 + 3, 5);}
}
CPE4235
Netbeans กด Ctrl + F6 หรอ คลกขวาแลวเลอก Test Fileเพอ run test
ถาไมม Exceptionแสดงวา Test ส าเรจ
แตถามแสดงวาTest ลมเหลว
CPE4235
ตองการ Test วา String ทรบเขามาเปนค าวา “Hello” จรงหรอไม
import org.junit.Test;import static org.junit.Assert.*;public class MyTest {
private boolean isHello(String str){ return “Hello”.equals(str); } @Testpublic void test() {
assertTrue(isHello(“Hello”));}
}
CPE4235
Assert method (เมธอทยนยน)
แนวทางการทดสอบ คอทดสอบใหตรงตามเปาหมายทเราคาดหวงไว
CPE4235
Assert method (เมธอทยนยน)
จากตวอยางเมอก เราคาดหวงไววา 2 + 3 มนจะเทากบ 5เรากเขยน 2 + 3 และ 5 ลงไปใน test method (@Test)
จากนนเรากใช method ตวนงในการยนยนวา input และสงทเราคดไวมนจะตรงกน method นนเราเรยกวา assert methodซงเราใช assertEquals ยนยนการเทากน
CPE4235
Assert method (เมธอทยนยน)
มหลายตว ขนอย กบวาเราคาดหวงอะไรไว จาก input ทเราปอนเขาไป
เราอยากรอะไรเกยวกบ input นน กใช assert method นน
CPE4235
Assert method (เมธอทยนยน)
Assert method ค าอธบาย
assertTrue(boolean c) ยนยนวา boolean ทสงเขาไป มคาเปนจรง
assertFalse(boolean c) ยนยนวา boolean ทสงเขาไป มคาเปนเทจ
assertEquals(Object o1, Object o2) ยนยนวา input 2 ตวมคาเทากน
assertNull(Object o) ยนยนวา input ทรบเขาไปตองเปน null
assertNotNull(Object o) ยนยนวา input ทรบเขาไปตองไมเปน null
assertSame(Object o1, Object o2) ยนยนวา input 2 ตวเปนตวเดยวกน
assertNotSame(Object o1, Object o2) ยนยนวา input 2 ตวไมเปนตวเดยวกน
… อนๆ อกมากมาย ตอนนยงไมจ าเปน (แตสามารถไปศกษาเพมเตมเองได)
CPE4235
JUnit Life Cycle
ในการ run Test 1 ครง JUnit จะม Life Cycle เปนของตวเองซงเอาไว setup คา clear คา ตางๆของการ Test
แตเอาไวกอน เดยวสอนทหลงตอนนเอาใหคลองเรอง assert method กอน
ถาใครอยากรกอนกสามารถไปเรยนรดวยตนเองกอนไดครบเรอง JUnit Life Cycle (คาบนยงไมเนน)
CPE4235
TDD Test Driven Development
ขบเคลอนการพฒนาดวยการเขยน Test
CPE4235
Test Driven Development (TDD)
เปนรปแบบการพฒนา Software ทเราจะตองสราง Test ขนมากอน แลวจงคอยเรมเขยน Code ในภายหลง
เปนการตกรอบ Logic Code ดวย Testกอนทจะเรมเขยน Code จรงๆ
CPE4235
หลกการเขยน TDD
1. เขยน code ให fail2. แกใหผาน3. Refactor หรอท า
code ใหสวยงาม4. กลบไปขอ 1 ใหม
จนกวา code จะ สมบรณแบบ
CPE4235
เราไมรวาจะเขยน code ยงไง ?แตเรารวา สง input เขาไปแลวได Output อะไรกลบมา
Codeinput output
CPE4235
@Testpublic void test1(){
int result = add(10, 20);assertEquals(30, result);
}
เรายงไมรวา ขางใน add เขยนยงไง แตเรารวา ถาสง 10 และ 20 เขาไป มนจะตองไดผลลพธเปน 30
CPE4235
run test ดวาผานมย
CPE4235
run test ดวาผานมย
แนนอนมนไมผานอยแลว เพราะยงไมม method add
งนกเขยน method add ขนมาซะ
CPE4235
@Testpublic void test1(){
int result = add(10, 20);assertEquals(30, result);
}
private int add(int number1, int number2){return 30;
}
CPE4235
run test ดวาผานมย
CPE4235
run test ดวาผานมย
ผาน เพราะมน return 30 ตามทเราคาดหวงไว
ลองเพม test อกสกกรณ ให number1 = 100และ number2 = 200
และคาดหวงวามนจะ return 300
CPE4235
@Testpublic void test2(){
int result = add(100, 200);assertEquals(300, result);
}
private int add(int number1, int number2){return 30;
}
CPE4235
run test ดวาผานมย
CPE4235
run test ดวาผานมย
ไมผาน
เพราะมน return 30
CPE4235
แลวถาเรา return เปน 300 ละ
Test นผาน (300)แต Test กอนหนานนจะพง (เพราะมนตองการ 30)
แสดงวา function การท างานของ add ทเราเขยนไวไมถกละ
นจงเปนวธการตกรอบการเขยน code อยางนงงนแก add ใหม
CPE4235
@Testpublic void test2(){
int result = add(100, 200);assertEquals(300, result);
}
private int add(int number1, int number2){return number1 + number2; //*********
}
CPE4235
run test ดวาผานมย
CPE4235
run test ดวาผานมย
ผานและผานทง 2 กรณคอ
@Testpublic void test(){
assertEquals(30, add(10, 20));assertEquals(300, add(100, 200));
}
CPE4235
Work!
CPE4235
โจทยประยกตใชความรตงแตเรมตน
จนถงวนน
CPE4235
สมมตบรษทไปรบงานเกยวกบการประเมนคณภาพมาเปนการประเมนคณภาพการรกษาของโรงพยาบาลทวประเทศ วาแตละโรงพยาบาล มการรกษาทไดมาตรฐานหรอไม
CPE4235
แตละโรงพยาบาล จะท าการสงขอมลผปวยเขามาทระบบสวนกลาง ประกอบไปดวยขอมล 2 ชด ทตองการให ประมวลผลคอ
• ขอมลผปวยใน (IP : Inner Patient) และ• ขอมลผปวยนอก (OP : Outer Patient)
***** ผปวยในคอคนทนอน รพ.ผปวยนอก คอคนทมาหาหมอในแตละวน
CPE4235
ขอมลทสงเขามาจะเปนขอมลการใชยาในแตละครง ของผปวยคนหนง - รายคน หรอ ราย PID (รหสประจ าตวประชาชน)
CPE4235
โปรแกรมเมอรทม A ไดเอาขอมลทโรงพยาบาลสงใหมาท าการประมวลผล ตามขอก าหนดการประเมนทสวนกลางก าหนดให จนไดขอมลสดทายทถกประมวลผลแลว
เหลอ field ขอมล ดงน
CPE4235
ขอมลผปวยใน (IP)
• hcode – รหสโรงพยาบาล• pid – รหสประจ าตวประชาชนของผปวย• drugName – ชอยาทผปวยไดรบ• visitDate – วนทเขารบการรกษา เปน Date• qty – จ านวนยาทไดรบ (เปนตวเลข เชน 100 qty)• unit - หนวยยา เชน vials, gram, tab เปนตน
CPE4235
• role1 – คะแนน ของเกณฑ ประเมนท 1• role2 – คะแนน ของเกณฑ ประเมนท 2• role3 – คะแนน ของเกณฑ ประเมนท 3• role4 – คะแนน ของเกณฑ ประเมนท 4• role5 – คะแนน ของเกณฑ ประเมนท 5
CPE4235
ขอมลผปวยนอก (OP)
• hcode – รหสโรงพยาบาล• pid – รหสประจ าตวประชาชนของผปวย• drugName – ชอยาทผปวยไดรบ• visitDate – วนทเขารบการรกษา เปน Date• qty – จ านวนยาทไดรบ (เปนตวเลข เชน 100 qty)• unit - หนวยยา เชน vials, gram, tab เปนตน
CPE4235
• role1 – คะแนน ของเกณฑ ประเมนท 1• role2 – คะแนน ของเกณฑ ประเมนท 2• role3 – คะแนน ของเกณฑ ประเมนท 3• role4 – คะแนน ของเกณฑ ประเมนท 4• role5 – คะแนน ของเกณฑ ประเมนท 5• role6 – คะแนน ของเกณฑ ประเมนท 6• role7 – คะแนน ของเกณฑ ประเมนท 7
CPE4235
ขอมลทง 2 ประเภทมความเหมอนกนยกเวนจ านวนของเกณฑการประเมนทตางกน
IP ม 5 ขอOP ม 7 ขอ
CPE4235
สมมตวา ท าการประมวลผลขอมลของโรงพยาบาลแหงหนงแลวไดผลการประเมนดงน
ผปวยใน (IP)
hcode Pid drugName visitDate qty unit role1 role2 role3 role4 role5
1234 00001 peginterferon 01/10/2555 100 gram Y Y N N Y
1234 00002 peginterferon 09/10/2555 50 gram Y Y Y Y Y
1234 00003 peginterferon 13/02/2555 150 gram Y Y N Y N
1234 00004 peginterferon 06/07/2556 25 gram Y N Y Y N
1234 00005 peginterferon 01/02/2555 100 gram N Y N N Y
CPE4235
และ
ผปวยนอก (OP)
hcode Pid drugName visitDate qty unit role1 role2 role3 role4 role5 role6 role7
1234 00011 peginterferon 01/10/2555 100 gram Y Y Y Y Y Y Y
1234 00012 peginterferon 09/10/2555 50 gram Y N N N Y Y Y
1234 00013 peginterferon 13/02/2555 150 gram Y Y Y Y Y Y Y
1234 00014 peginterferon 06/07/2556 25 gram Y Y N Y Y Y Y
1234 00015 peginterferon 01/02/2555 100 gram N N Y Y Y Y Y
CPE4235
ขอไหนตอบ Y (YES) ใหคดเปน 1 คะแนนขอไหนตอบ N (NO) ใหคดเปน 0 คะแนน
CPE4235
ขอมลน เปนเพยงขอมลสมมตซงจรงๆ แลวอาจมเกณฑการเมนมากกวาน (20 - 30 ขอ)และเกณฑการประเมนอาจจะไมใชตวเลข
CPE4235
จากนนโปรแกรมเมอรทม A โยนงานตอไปใหโปรแกรมเมอรทม B ท าการเขยนโปรแกรม หาคาผลรวม (Sum) และคาเฉลย (Average)เพอแสดงผลขอมลใหผใชเหน ดงน
CPE4235
ใหเขยนโปรแกรม เพอท าการหาผลรวมของขอมลแตละเกณฑ(ทก pid ใน hcode นนรวมกน)
role 1 มผลรวม (Sum) เทาไหรrole 2 มผลรวม (Sum) เทาไหร…และrole 1 มคาเฉลย (Average) เทาไหรrole 2 มคาเฉลย (Average) เทาไหร…
CPE4235
และหาวา ทกเกณของคนๆ นนรวมกน (ราย pid)มผลรวม (Sum) เปนเทาไหร และคาเฉลย (Average) เปนเทาไหร
Sum = role1 + role2 + role3 + … + role6 + role7Average = Sum / 7 (7 หมายถง ม 7 เกณฑ)
CPE4235
ตวอยาง
hcode Pid drugName visitDate qty unit role1 role2 role3 role4 role5 sum avg
1234 00001 peginterferon 01/10/2555 100 gram 1 1 0 0 1 3 0.6
1234 00002 peginterferon 09/10/2555 50 gram 1 1 1 1 1 5 1
1234 00003 peginterferon 13/02/2555 150 gram 1 1 0 1 0 3 0.6
1234 00004 peginterferon 06/07/2556 25 gram 1 0 1 1 0 3 0.6
1234 00005 peginterferon 01/02/2555 100 gram 0 1 0 0 1 2 0.4
4 4 2 3 3 16 3.2
0.8 0.8 0.4 0.6 0.6 3.2 0.64
CPE4235
ขอก าหนดของการเขยนโปรแกรม
ใชความรทงหมดทเรยนมา เพอแกปญหานขอมลชดหลายตว เกบขอมลลงใน Array กอนเรายงไมไดเรยน Collection Framework ยงไมตองใชแตถาใครรแลว จะใชกได ไมหาม
CPE4235
ขอบคณ
Software Testing จาก www.wikiwand.com/th/การทดสอบซอฟตแวร