programming methodologyvishnu/progmeth/2011...assertion – เง uอนไขท uตอ...

34
Programming Methodology

Upload: others

Post on 05-Apr-2020

6 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Programming Methodologyvishnu/progmeth/2011...assertion – เง Uอนไขท Uตอ งเป นจร ง ณ จ ดใดจด หน Uง ของโปรแกรม

Programming Methodology

Page 2: Programming Methodologyvishnu/progmeth/2011...assertion – เง Uอนไขท Uตอ งเป นจร ง ณ จ ดใดจด หน Uง ของโปรแกรม

Assertion Testing คืออะไร Test-Driven Development (TDD) JUnit JUnit Testing in Eclipse

Programming Methodology Testing 2

Page 3: Programming Methodologyvishnu/progmeth/2011...assertion – เง Uอนไขท Uตอ งเป นจร ง ณ จ ดใดจด หน Uง ของโปรแกรม

assertion – เง่ือนไขท่ีตอ้งเป็นจริง ณ จดุใดจดุหน่ึงของโปรแกรม

เม่ือเง่ือนไขเป็นเท็จ (false) จะเรียกวา่ assertion น้ัน “fail”

Programming Methodology Testing 3

assert Expression1 ;

assert Expression1 : Expression2 ;

เมือ่ “fail” จะ throw AssertionError (1) ไมม่รีายละเอยีด (2) แสดงรายละเอยีดตาม Expression2

Page 4: Programming Methodologyvishnu/progmeth/2011...assertion – เง Uอนไขท Uตอ งเป นจร ง ณ จ ดใดจด หน Uง ของโปรแกรม

Internal Invariants

Programming Methodology Testing 4

if (i % 3 == 0) { ... } else if (i % 3 == 1) { ... } else { // We know (i % 3 == 2) ... }

if (i % 3 == 0) { ... } else if (i % 3 == 1) { ... } else { assert i % 3 == 2 : i; ... }

Page 5: Programming Methodologyvishnu/progmeth/2011...assertion – เง Uอนไขท Uตอ งเป นจร ง ณ จ ดใดจด หน Uง ของโปรแกรม

Control-Flow Invariants ใชใ้นจดุท่ีคาดวา่จะไปไม่ถึง (will not be

reached) assert false;

Programming Methodology Testing 5

public void foo() { for (...) { if (...) return; } // Execution should never reach this point!!! }

public void foo() { for (...) { if (...) return; } assert false; // Execution should never reach this point! }

Page 6: Programming Methodologyvishnu/progmeth/2011...assertion – เง Uอนไขท Uตอ งเป นจร ง ณ จ ดใดจด หน Uง ของโปรแกรม

Preconditions/postconditions public จะไม่ใช ้ assert แตใ่หใ้ช ้ exception

(เด๋ียวไดเ้รียน)

Programming Methodology Testing 6

/** * Sets the refresh rate. * * @param rate refresh rate, in frames per second. * @throws IllegalArgumentException if rate <= 0 or * rate > MAX_REFRESH_RATE. */ public void setRefreshRate(int rate) { // Enforce specified precondition in public method if (rate <= 0 || rate > MAX_REFRESH_RATE) throw new IllegalArgumentException("Illegal rate: " + rate); setRefreshInterval(1000/rate); }

Page 7: Programming Methodologyvishnu/progmeth/2011...assertion – เง Uอนไขท Uตอ งเป นจร ง ณ จ ดใดจด หน Uง ของโปรแกรม

Preconditions/postcondition private จะใช ้ assert เพ่ือตรวจสอบ

Programming Methodology Testing 7

/** * Sets the refresh interval (which must correspond to a * legal frame rate). * * @param interval refresh interval in milliseconds. */ private void setRefreshInterval(int interval) { // Confirm adherence to precondition in nonpublic method assert interval > 0 && interval <= 1000/MAX_REFRESH_RATE : interval; ... // Set the refresh interval }

Page 8: Programming Methodologyvishnu/progmeth/2011...assertion – เง Uอนไขท Uตอ งเป นจร ง ณ จ ดใดจด หน Uง ของโปรแกรม

อย่าใช ้ assert เพ่ือ ตรวจสอบ argument ของ public method ท างานในค าสัง่ท่ีโปรแกรมตอ้งท า

▪ assert name.remove(null); // assert can be disabled. แกเ้ป็น ▪ boolean nullsRemoved = name.remove(null); ▪ assert nullsRemoved;

เพราะเรา disable assertion ได ้

Programming Methodology Testing 8

Page 9: Programming Methodologyvishnu/progmeth/2011...assertion – เง Uอนไขท Uตอ งเป นจร ง ณ จ ดใดจด หน Uง ของโปรแกรม

By default, assertions are disabled at runtime.

To enable, use the -enableassertions, or -ea, switch.

To disable, use the -disableassertions, or -da, switch.

no arguments - Enables or disables assertions in all classes except system classes.

Programming Methodology Testing 9

Page 10: Programming Methodologyvishnu/progmeth/2011...assertion – เง Uอนไขท Uตอ งเป นจร ง ณ จ ดใดจด หน Uง ของโปรแกรม

packageName... - Enables or disables assertions in the named package and any subpackages.

... - Enables or disables assertions in the unnamed package in the current working directory.

className - Enables or disables assertions in the named class

ตวัอย่าง runs a program, BatTutor, with assertions enabled in only package com.wombat.fruitbat and its subpackages: java -ea:com.wombat.fruitbat... BatTutor

Programming Methodology Testing 10

Page 11: Programming Methodologyvishnu/progmeth/2011...assertion – เง Uอนไขท Uตอ งเป นจร ง ณ จ ดใดจด หน Uง ของโปรแกรม

Programming Methodology Testing 11

Page 12: Programming Methodologyvishnu/progmeth/2011...assertion – เง Uอนไขท Uตอ งเป นจร ง ณ จ ดใดจด หน Uง ของโปรแกรม

กระบวนการในการเปรียบเทียบระหว่าง “ผลท่ีได”้ กบั “สิง่ท่ีควรจะเป็น”

จาก IEEE Standard 610.12-1990, "IEEE Standard Glossary of Software Engineering Terminology“

▪ "The process of operating a system or component under specified conditions, observing or recording the results, and making an evaluation of some aspect of the system or component."

Programming Methodology Testing 12

Page 13: Programming Methodologyvishnu/progmeth/2011...assertion – เง Uอนไขท Uตอ งเป นจร ง ณ จ ดใดจด หน Uง ของโปรแกรม

Engineer ท าอะไรจะตอ้ง มีการวางแผน ท าการออกแบบ ตามมาตรฐาน ลงมือท า และ

มีแผนทดสอบ

ประโยชน ์ รบัประกนัความถกูตอ้ง เขา้ใจปัญหา

Programming Methodology Testing 13

Page 14: Programming Methodologyvishnu/progmeth/2011...assertion – เง Uอนไขท Uตอ งเป นจร ง ณ จ ดใดจด หน Uง ของโปรแกรม

ตอ้งคิดใหดี้ๆ

Inputs คืออะไร มีอะไรบา้ง

Outputs ท่ีคาดหวงัของ input แตล่ะตวั

Order of execution cascading test cases independent test cases

Programming Methodology Testing 14

กรณีที ่1 กรณีที ่2 กรณีที ่3

กรณีที ่3 กรณีที ่2 กรณีที ่1

Page 15: Programming Methodologyvishnu/progmeth/2011...assertion – เง Uอนไขท Uตอ งเป นจร ง ณ จ ดใดจด หน Uง ของโปรแกรม

Unit Testing Integration

Testing

System Testing

Acceptance Testing

Programming Methodology Testing 15

Page 16: Programming Methodologyvishnu/progmeth/2011...assertion – เง Uอนไขท Uตอ งเป นจร ง ณ จ ดใดจด หน Uง ของโปรแกรม

• ทดสอบหน่วยท่ีเล็กท่ีสดุของโปรแกรม • C++, Java คลาส • C function

• ท าไปพรอ้มกบัการพฒันาโดยผูพ้ฒันา

• เพ่ือความมั่นใจในโปรแกรม • ตอ้งผ่าน 100%

Unit Testing

Integration Testing

System Testing

Acceptance Testing

Programming Methodology Testing 16

Page 17: Programming Methodologyvishnu/progmeth/2011...assertion – เง Uอนไขท Uตอ งเป นจร ง ณ จ ดใดจด หน Uง ของโปรแกรม

• based on requirements and specifications

• ไม่ตอ้งรูร้ายละเอียดภายในของโปรแกรมท่ีจะทดสอบ

Black box

• ทดสอบ internal path, structure และ implementation

• ตอ้งการความสามารถทางดา้น Programming สงู

White box

• แอบดนิูดนึง จนพอเขา้ใจการ implement แลว้ก็ท าตาม black box

Grey box Programming Methodology Testing 20

Page 18: Programming Methodologyvishnu/progmeth/2011...assertion – เง Uอนไขท Uตอ งเป นจร ง ณ จ ดใดจด หน Uง ของโปรแกรม

•0 - 59 F

•60 - 69 D

•70 - 79 C

•80 - 89 B

•90 - 100 A

จะตอ้งทดสอบอะไรบา้ง? ตอ้งทดสอบคะแนนไหนบา้ง?

Programming Methodology Testing 21

Page 19: Programming Methodologyvishnu/progmeth/2011...assertion – เง Uอนไขท Uตอ งเป นจร ง ณ จ ดใดจด หน Uง ของโปรแกรม

Positive test case Valid input valid result Functionality test

Negative test case Invalid input/condition Robustness test

จ านวน negative อาจจะมากกวา่ positive

Programming Methodology Testing 22

Page 20: Programming Methodologyvishnu/progmeth/2011...assertion – เง Uอนไขท Uตอ งเป นจร ง ณ จ ดใดจด หน Uง ของโปรแกรม

Boundary Value Analysis

Equivalence Partitioning/Class

มีอีกหลายวิธ ี (แตไ่ม่สอน) เชน่ logic coverage all-pair testing cause-effect state transition ฯลฯ

ทดสอบทัง้หมด ท าไม่ไหว เปลืองแรง เวลา เงิน และ ทรพัยากรอื่นๆ

Programming Methodology Testing 23

Page 21: Programming Methodologyvishnu/progmeth/2011...assertion – เง Uอนไขท Uตอ งเป นจร ง ณ จ ดใดจด หน Uง ของโปรแกรม

boundary condition อยู่ตรงขอบเขตพอดี อยู่สงูกวา่ขอบเขต 1 จดุ อยู่ต ่ากวา่ขอบเขต 1 จดุ

ของ input และ output ของ equivalence class

Programming Methodology Testing 24

Page 22: Programming Methodologyvishnu/progmeth/2011...assertion – เง Uอนไขท Uตอ งเป นจร ง ณ จ ดใดจด หน Uง ของโปรแกรม

-1, 0, 1, 58, 59, 60, 59, 60, 61, 68, 69, 70, 69, 70, 71, 78, 79, 80, 79, 80, 81, 88, 89, 90, 89, 90, 91, 99, 100, 101

ปรบัจดุแบง่ equivalence class

หา boundary value ของทัง้หมด

Programming Methodology Testing 25

-1, 0, 1, 58, 59, 60, 59, 60, 61, 68, 69, 70, 69, 70, 71, 78, 79, 80, 79, 80, 81, 88, 89, 90, 89, 90, 91, 99, 100, 101

•0 - 59 F

•60 - 69 D

•70 - 79 C

•80 - 89 B

•90 - 100 A

Page 23: Programming Methodologyvishnu/progmeth/2011...assertion – เง Uอนไขท Uตอ งเป นจร ง ณ จ ดใดจด หน Uง ของโปรแกรม

ลดจ านวนกรณีทดสอบลง โดยยงัครอบคลมุทัง้หมด แบ่งเป็น partition/class หรือ กลุม่ แตล่ะกลุม่ทดสอบสิ่งเดียวกนั ถา้มีกรณีทดสอบไหนเจอ bug กรณีอื่นในกลุม่เดียวกนัก็จะเจอเหมือนกนั

ถา้ไม่เจอ กรณีอื่นก็จะไม่เจอ

Programming Methodology Testing 26

Page 24: Programming Methodologyvishnu/progmeth/2011...assertion – เง Uอนไขท Uตอ งเป นจร ง ณ จ ดใดจด หน Uง ของโปรแกรม

จะทดสอบกรณีไหนบา้ง เฉพาะ valid input หรือ ทัง้ valid และ invalid input

Design by contract preconditions/postconditio

ns ทดสอบเฉพาะ valid input ต.ย. มี 5 สว่น

Defensive design ทดสอบหมด ต.ย. มี 5 + 1 สว่น

Programming Methodology Testing 27

invalid input • อาจจะแบ่งเป็น equivalence partition ย่อยๆ ไดอ้ีก

•0 - 59 F

•60 - 69 D

•70 - 79 C

•80 - 89 B

•90 - 100 A

Page 25: Programming Methodologyvishnu/progmeth/2011...assertion – เง Uอนไขท Uตอ งเป นจร ง ณ จ ดใดจด หน Uง ของโปรแกรม

แตกตา่งกนัตามชนิดของ input (ส าหรบั defensive design)

continuous range 1 valid + 2 invalids (below/above)

discrete values within a range 1 valid + 2 invalids

Programming Methodology Testing 28

Page 26: Programming Methodologyvishnu/progmeth/2011...assertion – เง Uอนไขท Uตอ งเป นจร ง ณ จ ดใดจด หน Uง ของโปรแกรม

แตกตา่งกนัตามชนิดของ input (ส าหรบั defensive design)

set of input value 1 valid + 1 invalid

“must be” situation e.g. “first character must be a letter” 1 valid + 1 invalid

Programming Methodology Testing 29

Page 27: Programming Methodologyvishnu/progmeth/2011...assertion – เง Uอนไขท Uตอ งเป นจร ง ณ จ ดใดจด หน Uง ของโปรแกรม

หา equivalence partition/class ของ combineRank(Card a) เป็นการรวมคา่ rank เขา้กบัไพ่อีกใบ โดยใหมี้คา่รวมไม่เกิน 21 (เมธอดนี้รีเทิรน์ int) ตวั rank ท่ีเป็นอกัษร ถือวา่มีคา่เทา่กบัสิบ ยกเวน้ A ท่ีมีคา่เท่ากบั 11 ก็ได ้ หรือ 1 ก็ได ้▪ ตวัอย่างเชน่ แตล่ะใบเป็นตวัเลข (this เป็นตวัเลข และ a เป็นตวัเลข)

▪ ลองหา equivalence class ท่ีเหลือ

Programming Methodology Testing 30

Page 28: Programming Methodologyvishnu/progmeth/2011...assertion – เง Uอนไขท Uตอ งเป นจร ง ณ จ ดใดจด หน Uง ของโปรแกรม

เป็นเครื่องมือท่ีใชช้ว่ยในการท า unit test ส าหรบัภาษา Java

open source (www.junit.org) Framework มาตรฐานส าหรบัการท า unit test ส าหรบัภาษา Java

ท าการทดสอบแบบ black box

Programming Methodology Testing 31

Page 29: Programming Methodologyvishnu/progmeth/2011...assertion – เง Uอนไขท Uตอ งเป นจร ง ณ จ ดใดจด หน Uง ของโปรแกรม

สรา้งคลาสท่ีจะเป็นตวัทดสอบ ภายในคลาสจะประกอบดว้ยเมท็อดตา่งๆ มากมาย แตล่ะเมท็อดก็จะท าการทดสอบ 1 กรณีตามท่ีไดห้าจาก

boundary value หรือ equivalent class ตัง้ชือ่ใหสื้่อความหมาย เติม @Test หนา้ชือ่เมท็อด แตต่อ้งมี import

org.junit.Test ท่ีตน้ไฟล ์

ถา้เป็น cascading test ก็มี test method ท่ีเรียก test ย่อยตามล าดบั

ถา้เป็น independent test ก็เขยีน 1 test method ส าหรบั 1 test case

Programming Methodology Testing 32

Page 30: Programming Methodologyvishnu/progmeth/2011...assertion – เง Uอนไขท Uตอ งเป นจร ง ณ จ ดใดจด หน Uง ของโปรแกรม

เม่ือตอ้งการทดสอบคา่ตา่งๆ ก็จะใช ้ เมท็อด assertXXXX(…) ท าการทดสอบ

เติม import org.junit.Assert.*; ท่ีตน้ไฟล ์ จะได ้ไม่ตอ้งพิมพช์ือ่ยาว

แตล่ะ assert จะมีเง่ือนไขท่ีจะเป็นจริงแตกตา่งกนัออกไป

ถา้ไม่ผ่าน จะเกิด AssertionError

Programming Methodology Testing 33

assertEquals assertFalse assertNotNull assertNotSame

assertNull assertSame assertTrue fail

Page 31: Programming Methodologyvishnu/progmeth/2011...assertion – เง Uอนไขท Uตอ งเป นจร ง ณ จ ดใดจด หน Uง ของโปรแกรม

Programming Methodology Testing 34

Assertion ผ่านเมื่อ

assertTrue พารามิเตอรเ์ป็น true

assertFalse พารามิเตอรเ์ป็น false

assertNull พารามิเตอรเ์ป็น null

assertNotNull พารามิเตอรไ์ม่เป็น null

assertEquals พารามิเตอรท์ัง้คูเ่ทา่กนั ตามการเรียกใช ้ equals

assertSame พารามิเตอรท์ัง้คูคื่อ object เดียวกนั

assertNotSame พารามิเตอรท์ัง้คูเ่ป็นคนละ object

fail Fail เสมอ

Page 32: Programming Methodologyvishnu/progmeth/2011...assertion – เง Uอนไขท Uตอ งเป นจร ง ณ จ ดใดจด หน Uง ของโปรแกรม

เม่ือตอ้งการทดสอบวา่มี exception ท่ีคาดหวงัเกิดขึน้หรือไม่

ตอนเพ่ิม @Test ใหเ้พ่ิมรายละเอียดดงันี ้

@Test (expected=YourExpectedException.class)

ตอนนีย้งัไม่อธบิาย เอาไวต้อนเรียน exception

Programming Methodology Testing 35

Page 33: Programming Methodologyvishnu/progmeth/2011...assertion – เง Uอนไขท Uตอ งเป นจร ง ณ จ ดใดจด หน Uง ของโปรแกรม

Setup JUnit โดยการ add JUnit library ใน Java Build Path ของโปรเจ็ค

Demo คลาส Grade.java Card.java combineRank(Card a)

Programming Methodology Testing 37

Page 34: Programming Methodologyvishnu/progmeth/2011...assertion – เง Uอนไขท Uตอ งเป นจร ง ณ จ ดใดจด หน Uง ของโปรแกรม

http://www.ibm.com/developerworks/java/library/j-junit4/index.html [Access July 5, 2011].

Johannes Link and Peter Frohlick, Unit Testing in Java: How tests Drive the Code, Morgan Kaufmann Publishers, 2003.

Russell Gold, Thomas Hammell and Tom Snyder, Test Driven Development: A J2EE Example, Apress, 2005.

Lee Copeland, A Practitioner's Guide to Software Test Design, Artech House, 2004.

JavaTM 2 SDK, Standard Edition Documentation Version 1.4.2, Programming With Assertions, Available: http://java.sun.com/j2se/1.4.2/docs/guide/lang/assert.html [Access July 23, 2008].

http://pmd.sourceforge.net/rules/junit.html#UseAssertEqualsInsteadOfAssertTrue [Access July 5, 2011].

http://junit.sourceforge.net/doc/cookbook/cookbook.htm [Access July 5, 2011].

Programming Methodology Testing 38