JUnit 軟體測試架構 JUnit Software Testing Framework

Slides:



Advertisements
Similar presentations
面向对象程序设计 、. 第二章 面向对象的分析与设计 学习目标 1 确定系统中的对象 2 确定对象的属性及操作 3 测试对象的有效性 4 区分对象和类 5 了解面向对象的编程和过程化编程之间的区别 6 了解封装的主要好处 7 了解软件开发的主要步骤.
Advertisements

系統分析與設計 楊子青 H-1 H 、物件導向技術 n 物件導向的基本概念 – 物件、類別 – 封裝、繼承 – 同名異式 ( 多型 ) 、超荷 ( 過載 ) n 物件導向分析與設計及塑模工具 n UML 塑模工具.
微软的秘诀 -- 软件开发中的测试管理 李丹软件测试工程师视窗数字媒体事业部 Microsoft Corporation.
项目6 通用堆栈.
第1章 Java语言概述.
軟體工程 -物件導向程式設計與UML系統分析實作
鄭士康 國立台灣大學 電機工程學系/電信工程研究所/ 資訊網路與多媒體研究所
統合分析臨床試驗實之文獻品質評分:以針灸療法之統合分析為例
程序设计基础 贺辉 图书馆三楼办公室(进馆左侧上楼)
Java的程式架構與基本觀念 Java語言的歷史 Java程式的開發環境 Java程式的架構 輸出與輸入物件之使用 工具使用方法介紹
第一章 系統開發概論 1-1 系統開發概論 1-2 常見的資訊系統 1-3 系統開發生命週期 1-4 系統開發方法論簡介.
何謂專案管理? 美國專案管理學會 專案管理就是「為達成或超出利害關係人的需求或期望,把種種知識、技能、工具、技術應用在專案活動上,…,其牽涉到相互競爭的範疇,時間、成本、品質,以及利害關係人各種不同需求和期望之間的平衡」
四資二甲 第三週作業 物件導向程式設計.
第9章 系統建置.
Java Programming Hygiene - for DIDC
第二章 UML簡介 課前指引 本章介紹什麼是UML以及利用圖形來塑模資訊系統的好處在哪裡。文中也介紹了何謂「4+1的觀點」、以及簡述各項UML圖形的使用目的。並且,我們從靜態以及動態這兩個觀點來分類、介紹各圖形的使用時機。
欢迎各位 Nice to Meet U.
Chaoping Li, Zhejiang University
第八章 分析與設計階段 – 物件導向設計(OOD)
Operating System CPU Scheduing - 3 Monday, August 11, 2008.
Homework 4 an innovative design process model TEAM 7
Android + JUnit 單元測試 建國科技大學資管系 饒瑞佶 2012/8/19V4.
API设计实例分析 通用IO API.
第一章 軟體工程概論.
H、物件導向技術 物件導向的基本概念 物件、類別 封裝、繼承 同名異式(多型) 、超荷(過載) 物件導向分析與設計及塑模工具 UML塑模工具.
軟體工程 -物件導向程式設計與UML系統分析實作
第六章 类的扩展与继承.
中国散裂中子源小角谱仪 的实验数据格式与处理算法 报告人:张晟恺 中国科学院高能物理研究所 SCE 年8月18日
單元3:軟體設計 3-2 順序圖(Sequence Diagrams)
Popular Uses of ABC/M - the 1st half
Decision Support System (靜宜資管楊子青)
创建型设计模式.
周宇 南京航空航天大学 软件设计模式与体系结构 周宇 南京航空航天大学
软件建模训练(6-2) 设计模式 张静 南京理工大学计算机科学与工程学院.
鄭士康 國立台灣大學 電機工程學系/電信工程研究所/ 資訊網路與多媒體研究所
面向对象程序设计 、.
第4章 物件導向分析與設計簡介 4-1 物件導向的軟體系統開發 4-2 物件導向分析與設計 4-3 UML的物件導向分析與設計
2018/12/7 Java语言程序设计 教师:段鹏飞.
软件建模与UML.
問題導向學習教學策略(PBL) 對學生學習成效的初探
971研究方法課程第九次上課 認識、理解及選擇一項適當的研究策略
SPOTO TM JAVA课程 JAVA中的OO语法
Lesson 44:Popular Sayings
Agile Software Development
Symbolic Execution During Test Data Generation and Augmentation Top Paper Review Zhiyi Zhang.
Decision Support System (靜宜資管楊子青)
C/C++/Java 哪些值不是头等程序对象
两种不同类别的软件: 功能预定义软件;用户驱动的软件。他们对软件工程方法有不同的需求
類別與物件 I (Classes and Objects I)
Chapter 5 Recursion.
IBM SWG Overall Introduction
資料結構 Data Structures Fall 2006, 95學年第一學期 Instructor : 陳宗正.
面向对象 程序设计语言基础 马骏
JAVA 编 程 技 术 主编 贾振华 2010年1月.
C#程序设计基础 $3 成员、变量和常量.
第二章 資訊系統開發模式.
虚 拟 仪 器 virtual instrument
爬蟲類動物2 Random Slide Show Menu
徐迎晓 复旦大学软件学院 实现模型 徐迎晓 复旦大学软件学院.
Java程式初體驗大綱 大綱 在學程式之前及本書常用名詞解釋 Hello Java!程式 在Dos下編譯、執行程式
Inheritance -II.
An organizational learning approach to information systems development
第二章 Java基本语法 讲师:复凡.
An Quick Introduction to R and its Application for Bioinformatics
第6單元 6-1 類別的繼承 (Class Inheritance) 6-2 抽象類別 (Abstract Class)
JAVA 程式設計與資料結構 第三章 物件的設計.
Usage Eclipse 敏捷方法工具介紹 實驗室網站:
Gaussian Process Ruohua Shi Meeting
CAI-Asia China, CATNet-Asia
Presentation transcript:

JUnit 軟體測試架構 JUnit Software Testing Framework 葉秉哲 2002/7/4. http://william.cswiz.org/present/20020704 ● 講題介紹 無錯誤的軟體是軟體專案的夢想,但隨著軟體系統日益龐雜, 測試任務也越來越艱困。是否有既輕巧、威力強、彈性十足, 又經濟實惠的輔助工具呢? Kent Beck 是 extreme programming 創始人, Erich Gamma 是赫赫有名的 Design Patterns 四巨頭之一, 這兩位軟體大師通力合作的產物:JUnit,究竟有什麼樣的魅力, 風靡軟體界,更於 2001~2002 連續兩年贏得 JavaWorld Editors’ Choice Awards 的 “Best Java Performance Monitoring/Testing Tool” 獎項呢? 且讓我們一起來認識、掌握 JUnit 軟體測試架構吧!

JUnit 的定位 JUnit is… JUnit is not… 單元測試 整合測試 骨幹、架構 完整系統 工具 方法論 手動產生 scope 單元測試 整合測試 testware 骨幹、架構 完整系統 level 工具 方法論 test case 手動產生 自動產生 test driver / script 部份手寫 全自動 2

大綱 引子 JUnit 基礎篇 JUnit 進階篇 軟體測試基礎 推薦讀物 3

一、引子 一流的科學家可以做出很有價值的實驗,產生新知識;二流科學家只是忙於各種實驗,蒐集大量數據,但對知識的累積沒什麼用處。 --- David Salsburg

JUnit 簡介 Regression testing framework written by Erich Gamma and Kent Beck Open Source Hosted on SourceForge Language support Smalltalk, Java, C++, Perl, Python, etc. IDE Support JBuilder, VisualAge, etc. 5

What is Software Testing? The execution of code using combinations of input and state selected to reveal bugs. The process of devising and executing a test suite that attempts to cause failures, increasing our confidence that failures are unlikely. 6

Why Testing? 目的:矛與盾 重要性 Reveal bugs: quality control Confidence: qualitative & quantitative 重要性 Paradigm↑  productivity↑  testing & debugging↑ Software features that can’t be demonstrated by automated tests simply don’t exist. [Beck 1999, p.45] 7

Testing: CMM Perspective The Key Process Areas by Maturity Level Source: Capability Maturity Model for Software, v1.1 http://www.sei.cmu.edu/publications/documents/93.reports/93.tr.024.html 8

Testing: RUP Perspective Source: Philippe Kruchten, The Rational Unified Process: An Introduction, p.62, Addison Wesley, 1998. 9

Testing: XP Perspective Source: Kent Beck, Extreme Programming Explained: Embrace Change, p.70, Addison Wesley, 1999. If you’re not validating everything all the time, you’re not doing XP. Period. 10

Test What? Every artifact during the whole development process should be tested. 11

軟體測試工具分類 分類 實例 reviews & inspections test planning lint Compuware DevPartner test planning Rational Suite TestStudio test design & development test execution & evaluation capture/playback coverage analysis Borland Optimizeit memory testing test case management sumulations & performance profiler test support 12

JUnit 的定位 JUnit is… JUnit is not… 單元測試 整合測試 骨幹、架構 完整系統 工具 方法論 手動產生 scope 單元測試 整合測試 testware 骨幹、架構 完整系統 level 工具 方法論 test case 手動產生 自動產生 test driver / script 部份手寫 全自動 13

JUnit Framework 14

How to Test with JUnit? TestCase TestRunner Foo FooTest run 1..* exercise 1..* Foo FooTest test1 test2 … 15

Questions… 如何測試? strategy 多少測試才夠? coverage 流程? process 工具影響? medium is message 16

二、JUnit 基礎篇 Extreme Programmers test everything that could possibly break, using automated tests that must run perfectly all the time. --- Extreme Programming Installed

Design Goals of JUnit Easy to use Requires no more work than absolutely necessary to write a new test Leverages existing tests to create new ones Reusable fixtures to run different tests Retains values of tests over time Combines tests from various authors and run them together without fear of interference 18

Case Study 自動產生測試框架 Using Borland JBuilder 6.0 最簡單的完整測試實例 19

實例一 junit TestCase exercise 1..* Foo FooTest test1 test2 … 20

實例一:簡單的待測物 public class Money { private int fAmount; private String fCurrency; public Money(int amount, String currency) { fAmount = amount; fCurrency = currency; } public Money add(Money m) { return new Money(amount() + m.amount(), currency()); public int amount() { return fAmount; } public String currency() { return fCurrency; } 21

實例一:產生測試框架 [1/7] Borland JBuilder 6.0 22

實例一:產生測試框架 [2/7] Borland JBuilder 6.0 23

實例一:產生測試框架 [3/7] Borland JBuilder 6.0 24

實例一:產生測試框架 [4/7] Borland JBuilder 6.0 25

實例一:產生測試框架 [5/7] Borland JBuilder 6.0 26

實例一:產生測試框架 [6/7] Borland JBuilder 6.0 27

實例一:產生測試框架 [7/7] import junit.framework.*; 實例一:產生測試框架 [7/7] import junit.framework.*; public class MoneyTest extends TestCase { public MoneyTest (String s) { super(s); } protected void setUp() { } protected void tearDown() { } public void testAdd() { int val1 = 0; String val2 = "STRING0"; Money money = new Money(val1, val2); Money val1 = null /** @todo fill in non-null value */ ; Money moneyRet = money.add(val1); /** @todo: Insert test code here. Use assertEquals(), for example. */ } 28

Lesson Learned Code a little, test a little 29

實例二 TestCase TestRunner Foo FooTest run exercise 1..* test1 test2 … junit TestCase TestRunner run exercise 1..* Foo FooTest test1 test2 … 30

實例二:待測物,修正版 public class Money implements Cloneable { private int fAmount; private String fCurrency; public Money(int amount, String currency) { /*...*/ } public Money add(Money m) { if (m == null) return (Money) clone(); return new Money(amount() + m.amount(), currency()); } public Object clone() { /*...*/ } public boolean equals(Object obj) { /*...*/ } public int amount() { /*...*/ } public String currency() { /*...*/ } 31

實例二:測試碼 [1/2] import junit.framework.*; 實例二:測試碼 [1/2] import junit.framework.*; public class MoneyTest extends TestCase { public MoneyTest (String s) { super(s); } public void testNullAdd () { String curr = "NTD"; int val1 = 2002; Money money1 = new Money(val1, curr); Money money2 = null; // null value Money money3 = money1.add(money2); Assert.assertEquals(money1, money3); } 32

實例二:測試碼 [2/2] public void testSimpleAdd() { String curr = "NTD"; 實例二:測試碼 [2/2] public void testSimpleAdd() { String curr = "NTD"; int val1 = 2002; int val2 = 345; int val3 = val1 + val2; Money money1 = new Money(val1, curr); Money money2 = new Money(val2, curr); Money money3 = money1.add(money2); assertEquals(money3, new Money(val3, curr)); } 33

Success java -cp lib\junit.jar;. junit.swingui.TestRunner MoneyTest 34

Failure 1/2 35

Failure 2/2 36

Error 1/2 37

Error 2/2 38

Lessons Learned Generate & exercise test case(s) Verify Write test…() method(s) Verify Choose a Assert.assert…() Choose a TestRunner junit.textui.TestRunner junit.swingui.TestRunner Failure vs. error 39

三、JUnit 進階篇 The tests that you write in XP are isolated and automatic. --- Extreme Programming Explained

Case Study Fixture/context 管理 Test suite 與進入點 Grouping by tasks Configuration management Regression testing 41

實例三 TestCase TestRunner Foo FooTest run 1..* exercise 1..* test1 test2 junit TestCase TestRunner run 1..* exercise 1..* Foo FooTest test1 test2 … setUp() tearDown() 42

實例三:測試碼 [1/2] import junit.framework.*; 實例三:測試碼 [1/2] import junit.framework.*; public class MoneyTest extends TestCase { private Money money1, money2, money3; public MoneyTest(String s) { /*...*/ } protected void setUp() { String curr = "NTD"; int val1 = 2002; int val2 = 345; money1 = new Money(val1, curr); money2 = new Money(val2, curr); money3 = new Money(val1 + val2, curr); } 43

實例三:測試碼 [2/2] protected void tearDown() { } 實例三:測試碼 [2/2] protected void tearDown() { } public void testNullAdd() { Money money10 = money1.add(null); // null value assertEquals(money1, money10); } public void testSimpleAdd() { Money money10 = money1.add(money2); assertEquals(money3, money10); 44

Lessons Learned Fixture Each test…() method is isolated Overrides setUp() Overrides tearDown() Each test…() method is isolated 45

實例四 TestCase TestSuite TestRunner Foo FooTest test suite test case run junit TestCase TestSuite TestRunner run 1..* exercise 1..* Foo FooTest test1 test2 … test suite test case 46

實例四:測試碼 [1/3] import junit.framework.*; 實例四:測試碼 [1/3] import junit.framework.*; public class MoneyTest extends TestCase { private Money money1, money2, money3; public MoneyTest (String s) { /*...*/ } protected void setUp() { /*...*/ } public void testNullAdd() { /*...*/ } public void testSimpleAdd() { /*...*/ } 47

實例四:測試碼 [2/3] // [interactive mode] 實例四:測試碼 [2/3] // [interactive mode] // entry point of the whole test suite! /* // Version 1 public static Test suite() { TestSuite suite = new TestSuite(); suite.addTest(new MoneyTest("testNullAdd")); suite.addTest(new MoneyTest("testSimpleAdd")); return suite; } */ // Version 2 return new TestSuite(MoneyTest.class); 48

實例四:測試碼 [3/3] // [batch mode] // entry point of the whole test suite! 實例四:測試碼 [3/3] // [batch mode] // entry point of the whole test suite! public static void main(String args[]) { junit.textui.TestRunner.run(suite()); } 49

Lessons Learned Test case suite Write a suite() as the interactive mode entry point Write a main() as the batch mode entry point 50

實例五:Composite Pattern 51

實例五:before grouping FooTest test case test suite Foo exercise test 1 … test case test suite Foo 52

實例五:grouping by tasks test suite basic test FooTest random test Foo exercise Foo monkey test stress test 53

實例五:composite test suites public class Money_test extends TestCase { public MoneyTest (String s) { /*...*/ } public static Test suite() { TestSuite suite = new TestSuite(); suite.addTest(Money_test_basic.suite()); suite.addTest(Money_test_random.suite()); suite.addTest(Money_test_monkey.suite()); return suite; } public static void main(String args[]) { junit.textui.TestRunner.run(suite()); 54

55

Lessons Learned Grouping by configuration policy By tasks By persons By revisions Configuration management Naming scheme Process Scripts 56

小結:JUnit 使用四部曲 Fixture Exercise Verify Suite management Overrides setUp() and/or tearDown() Exercise Writes test…() Verify Uses Assert.assert…() Suite management Writes suite() and/or main() 57

其他主題 Reports TestResult Extensions for various application domains 58

四、軟體測試基礎 Program testing can be used to show the presence of defects, but never their absence! --- Edward Dijkstra

Why Verification/Testing is Hard? 理論限制 Intractable Undecidable 實務限制 成本 流程 人因 60

軟體測試方法論:分類 Scope Strategy Unit test Integration test System test Acceptance test Strategy Responsibility-based (black box) Implementation-based (white box) Hybrid (gray box) Fault-based 61

OO Testing Manifesto 觀察 信條 No silver bullet Every advance has a price Iterative & incremental Regression testing 信條 Fault models Test automation Test-effective process 62

Fault Models 重要性 正面: conformance-directed 反面: fault-directed exhausive testing 不可能,合理的 testing strategy 必須根據 fault models 的引導 正面: conformance-directed Feature sufficient 反面: fault-directed Fault efficient 63

五、推薦讀物 Tests are both a resource and a responsibility. --- Extreme Programming Explained

軟體測試通論 Edward Kit, Software Testing in the Real World: Improving the Process, Addison-Wesley/ACM Press, 1995. Boris Beizer, Black-Box Testing, John Wiley & Sons, 1995 Larry J. Morell and Lionel E. Deimel, Unit Analysis and Testing, SEI Curriculum Module SEI-CM-9-2.0, June 1992. http://www.sei.cmu.edu/publications/documents/cms/cm.009.html Hong Zhu, Patrick A. V. Hall, John H. R. May, “Software Unit Test Coverage and Adequacy,” ACM Computing Surveys, vol 29, no 4, 1997/12. 65

物件導向軟體測試 Robert V. Binder, Testing Object-Oriented Systems: Models, Patterns, and Tools, Addison-Wesley, 2000. 66

JUnit JUnit 網站: http://www.junit.org Test Infected: Programmers Love Writing Tests JUnit Cookbook JUnit: A Cook’s Tour 67

與 JUnit 有關的軟體開發流程 [Beck 1999] Kent Beck, Extreme Programming Explained: Embrace Change, Addison-Wesley, 1999. Ron Jeffries, Ann Anderson, and Chet Hendrickson, Extreme Programming Installed, Addison-Wesley, 2001. 68

69