foundation of software development 1

67
Software Development for Large and Open Source Projects Kun-Ta Chuang Department of Computer Science and Information Engineering National Cheng Kung University 1

Upload: netdbncku

Post on 15-Jan-2015

589 views

Category:

Documents


2 download

DESCRIPTION

 

TRANSCRIPT

Software Development for Large and Open Source Projects

Kun-Ta Chuang Department of Computer Science and Information Engineering

National Cheng Kung University

1

Software Development Foundation I

Kun-Ta Chuang Department of Computer Science and Information Engineering

National Cheng Kung University

2

Revision Control

3

• 版本控制(Revision control) – 維護工程藍圖的標準作法 – 能追蹤工程藍圖從誕生一直到定案的過程 – 軟體工程技巧,藉此能在軟體開發的過程中,確保由不同人所編輯的同一程式檔案都得到同步

4

概述

• 透過文檔控制(documentation control),能記錄任何工程專案內各個模組的改動歷程,並為每次改動編上序號

• 一種簡單的版本控制形式如下:賦予初版一個版本等級「A」。做了第一次改變後,版本等級改為「B」,以此類推。最簡單的例子是,最初的版本指定為「1」,當做了改變之後,版本編號增加為「2」,以此類推。

5

概述

• 版本控制能提供專案的設計者,將設計回復到之前任一狀態,這特性在設計過程中,碰到完全無法運作的情況時,非常重要

6

軟體版本控制

• 有時候,一個程式同時存有兩個以上的版本也有其必要性 – 例如:在一個為了部署的版本中程式錯誤已經被修正、但沒有加入新功能;在另一個開發版本則有新的功能正在開發、也有新的錯誤待解決,這使得同時間需要不同的版本並修改

7

軟體版本的控制方法

• 最簡單的版本控制就是保留軟體不同版本的數份copy,並且適當編號。許多大型開發案都是使用這種簡單技巧 – 雖然這種方法能用,但是很沒效率

• 因為保存的數份copy幾乎完全一樣 • 因為這種方法要高度依靠開發者的自我紀律,而常導致錯誤

8

軟體版本的控制方法

• 因此,有人開發出了將部份或全部版本控制工作自動化的版本控制系統。

• Delta encoding – 大部份的版本控制軟體採用Delta encoding:只保留檔案相繼版本之間的差異,這個方法可以更有效的儲存數個版本的檔案。

9

中央式系統 VS 分散式系統

• 中央式系統 – 由中央權威管理存取權限;或是像分散式系統容許多個單位同時進行,包括同時更動同一檔案。

– 傳統上版本控制系統都是採用中央式系統:所有版本控制的工作在一個伺服器進行,由中央權威管理存取權限「鎖上」檔案庫中的檔案,一次只讓一個開發者工作

10

• 分散式系統 – 開發者直接在各自的本地檔案庫工作,並容許多個開發者同時更動同一檔案,而各個檔案庫有另一個合併各個改變的功能。這個方式讓開發者能不靠網路也能繼續工作,也讓開發者有充分的版本控制能力,而不需經中央權威許可。分散式系統仍然可以有檔案上鎖功能。

– 分散式系統Linux kernel的發明人Linus Benedict Torvalds就是分散式版本控制系統的支持者,他開發了目前被開源社群廣泛使用的分散式版本控制系統Git

11

著名的版本控制軟體 • BitKeeper • CVS(Concurrent Versions System) • Micorosoft Visual SourceSafe • Perforce • Rational ClearCase • RCS(GNU Revision Control System) • Serena Dimention • Subversion • SVK • Git • en:Monotone (software) • en:Bazaar (software) • Mercurial • en:SourceGear Vault

12

Eclipse+Git

13

Initial Setup

• 首先請先下載eclipse – Eclipse IDE for Java Developers

• 若下載其他版本看不到Git – Help>Install New Software>add – http://download.eclipse.org/egit/updates – 貼上以上網址即可安裝EGit

14

(cont.)

15

(cont.)

16

(cont.)

17

Check out

18

Check out

http://code.google.com/hosting/ 19

(cont.)

20

(cont.)

21

(cont.)

22

(cont.)

23

(cont.)

24

(cont.)

25

(cont.)

26

Check in

27

Commit

28

(cont.)

29

Push to Upstream

30

(cont.)

31

(cont.)

32

Finish

33

Reference

• http://en.wikipedia.org/wiki/Revision_control

34

Unit testing

35

• Let’s talk about Testing • What is unit testing? • Properties of a Unit Test • Why Unit Test? • Why not Unit Test? • List of unit testing frameworks

Outline

36

Testing • 測試的方法

– 黑箱測試 – 白箱測試

• 測試的類型 – 功能測試 – 系統測試 – 邊界值測試 – 效能測試 – 壓力測試

測試的階段 ◦ 單元測試 ◦ 整合測試 ◦ 系統測試 ◦ 回歸測試

37

• 單元測試是針對程式單元來進行正確性檢驗的測試工作 • 程式單元

– 通常,一個程式單元就是單個程式、函式等 – 對於物件導向語言來說,最小的單元就是method

• 測試案例 – 每個理想的測試案例都應該獨立於其他案例

• 單元測試通常由開發人員編寫,可以手動測試,或是做為建構自動化的一部分 – 以java來說…

• 結合Ant: 建立建構環境與自動化執行的工具。 • 結合Maven: 提供建構環境、慣例與相依管理的工具。 • 通通包在CI中

What is unit testing?

38

• Isolated – 沒必要為了測試輪胎而買台車子

• Repeatable – Tests 不能依賴於執行環境,每個developer都應該要可以run

• Fast – 單元測試的時間較短、快

• Self-Documenting – Testable code is clear and easy to follow – 不需要特別解釋元件如何執行,只需要看測試怎麼跑即可

Properties of a Unit Test

39

• Debugging很花時間 • 當一個新的功能被加進來時,我們要如何確定舊的不會受到影響?

• 從Unit Test你可以看出這個class的功能為何以及如何使用

• Unit Test可以用來量測project的健康度與code的品質

Why Unit Test?

40

• 寫code從來沒有bug • 功能都超簡單 • 寫測試會大幅拖累我的進度 • PM不讓我寫 • 我不會寫…

Why not Unit Test?

41

• 各種程式語言都有適合的單元測試工具可以使用 – Java

– C/C++

– .NET

– PHP

– HTML

List of unit testing frameworks

42

Unit Testing Frameworks

• Java

工具名稱 說明

JUnit 一個以逆向Framework測試的Java試工具,開發人員可用來進行Java的單元測試。

JUnitEE JUnit的延伸版,可在J2EE Application Server上執行。

JMock 一個用於Java測試的函式庫,可快速的定義合適模擬物件。

43

Unit Testing Frameworks • C/C++

工具名稱 說明 C unit Test System

以節點的方式測試系統,是一以專為C語言設計的測試工具。

Cgreen 一個純C單元測試工具,整合了測試套件,對於結果及建立新的測試函數有很大的彈性。

CMock 支援模組式/物件式的測試工具,以交談試的方式進行單元測試。 圖片來源: http://www.lastcraft.com/cgreen.php 44

Unit Testing Frameworks

• .Net

工具名稱 說明

ASP Unit Microsoft Active Server Pages (ASP)測試工具。

csUnit 支援C# , VB .Net , managed C++ 。

.NetUnit 對圖形元件進行測試的工具。

圖片來源: http://www.csunit.org/ 45

Unit Testing Frameworks

• PHP

工具名稱 說明

PHPUnit PHP4專用,適用於輕量的軟體開發。

AMock 由EasyMock而來的函式庫。

Izh_test 可在Console底下進行php的測試。

圖片來源: http://php-gtk.eu/en/version/php-gtk-2?page=8 46

Unit Testing Frameworks

• HTML

工具名稱 說明

HTML Tidy 可完美的自動修正Html的語法錯誤。

HtmlTestCase 支援使用高階的API進行自動的功能測試,試用於QA人員。

HtmlUnit Junit的測試Framework之一。

47

Example-Junit

import static org.junit.Assert.*; import org.junit.*; …………. public class CalculatorTest { private Calculator calculator; @Before public void setUp() { calculator = new Calculator(); } @After public void tearDown() { calculator = null; } @Test public void testPlus() { int expected = 5; int result = calculator.plus(3, 2); assertEquals(expected, result); }

public class Calculator { public int plus(int op1, int op2) { return op1 + op2; } public int minus(int op1, int op2) { return op1 - op2; } }

Unit test for class Calculator’s method plus: Class Calculator:

當然,可以配合多種design pattern去設計你的test,像是

Command…,etc

JUnit 4.x中,不用像3.x一般需要繼承TestCase類別,而可以使用@Test標註測試方法,方法只需公開、沒有傳回值、沒有參數,名稱則可以

任意。

48

Example-Junit

測試成功 測試失敗

49

TDD( Test-driven development)

• 由測試去驅動開發功能 – 在撰寫真正的程式碼前,先將相關測試寫好

• 並不是單純在做 verification,它是一種 spec 確認的活動 – 避免程式寫到最後,與最初的設計差別太大

• TDD全然關乎為特定功能做測試,接著,撰寫程式碼滿足該功能。 – 任何超過該功能的事情,目前對你皆不重要 – 避免浪費時間做了不必要的功能

50

• Head First Software Development – Dan Pilone & Russ Miles

• http://en.wikipedia.org/wiki/List_of_unit_testing_frameworks • http://www.slideshare.net/avalanche123/clean-code-5609451 • http://caterpillar.onlyfun.net/Gossip/JUnit/index.html • http://zh.wikipedia.org/wiki/%E8%BB%9F%E9%AB%94%E6%B8%AC%E8%A9%A6#.

E8.BD.AF.E4.BB.B6.E6.B5.8B.E8.AF.95.E4.BB.8B.E7.BB.8D

Reference

51

HW 1 • Upload your first code to public code host like google code host or github

– With a small code without compilation errors • More than 100 lines ‘source’ • More than 30 lines ‘comment’ to describe your source

– With unit testing file – With a README informing how to execute unit testing for your code

• Evaluated by teams – Each team should have a HW1 contact window in charge of emailing to TA

• 黃首翰 [email protected] • Tell TA where we can check out your code (if you use git, give the URL)

• Deadline 10/24 12:00 pm – if you did not get confirmed email from TA. We say byebye byebye … byebye~~ – You should do it ASAP to ensure your success

52

HW 1

• Remind you – TAs will check your coding style – TAs won’t ask you if he cannot execute your code but

fully comply with your README – The team score is the average score from 4 TAs.

• Like an academic review process, if their scores are highly diverse, I will check and join to determine the score.

– Just four levels • Weak: 50 • Above Average: 70 • Good: 80 • Excellent: 100

53

Build Automation

• 歷史 – 一開始,於command line進行程式碼編譯及連結。

• 程式碼一多就相當麻煩。 – 出現make script language,如GUN make,為建置自動化的開始。

• 支援多個程式模組編譯及連結。 – 隨者建置過程複雜度的提升,便開始出現一些商業化或免費的自動建置軟體。

• 對於Continuous Integration相當有幫助。

介紹

• 什麼是Build automation ? • 將軟體設計師的每日工作,以自動化技術或腳本語言方式,自動加以完成的工具與技術。工作包含 : – 以編譯器將原始碼編譯成二進位碼( Binary code) – 將二進位碼打包成軟體執行檔 – 執行單元測試 – 部署軟體(Software deployment) – 產生文件與 Release notes

介紹

• 於專案軟體開發,使用Build automation 優點 – 提升產品品質 – 加快編譯及連結的效率 – 減少“bad build”發生 – 降低關鍵人員依賴性 – 保留建置歷史記錄 – 節省時間以及成本

介紹

• Ant – Apache提供的免費軟體 – 為command line工具,主要用來進行Java code的自動建置。

– Script腳本主要用XML格式來撰寫

相關工具介紹 - Ant

• 以HelloWorld為範例進行編譯和執行

相關工具介紹 - Ant

Fig1 :以Hello world為例

相關工具介紹 - Ant

Fig2 :以Hello world為例,ant建置的腳本檔案Sample

設定參數

編譯

產生執行檔

執行

相關工具介紹 - Ant

Fig3 :以Hello world為例,ant建置結果

• 以Math為範例進行Junit測試

相關工具介紹 - Ant

Fig4. 以Math為例,待測試的程式碼

相關工具介紹 - Ant

Fig5. 以Math為例,測試案例撰寫

相關工具介紹 - Ant

Fig6 :以Math為例,ant建置的腳本檔案Sample

進行 測試

產生 報表

相關工具介紹 - Ant

Fig7 :以Math為例,測試結果的報表

• 和Ant一樣是專案自動化建置的工具 • 和Ant比較起來,Maven有以下額外功能 :

– 集中管理相依性 • Maven使用集中式管理,提供Central repository,你要在設定檔案宣告相依的程式庫等資訊,Maven會為你下載相關的檔案。

– plugin 為基礎的架構 • Maven 提供固定的建構生命周期,每個周期又有幾個階段,每個階段會有一些相連結的plugin,可以在設定檔中依需求宣告想使用的plugin,Maven會自動取得plugin。

相關工具介紹 - Maven

• Wiki Build automation http://en.wikipedia.org/wiki/Build_automation • Tool - Apache Ant http://ant.apache.org • Tool – Maven http://maven.apache.org/ • JUnit Gossip: 使用 Maven • http://caterpillar.onlyfun.net/Gossip/JUnit/Maven.

html

參考資料