30
UNIT TEST Nhóm 10 1

UNIT TEST Nhm 10

Embed Size (px)

DESCRIPTION

Các nội dung chính Định nghĩa Unit Test Tầm quan trọng Unit Test Phương pháp xây dựng Unit Test Các đối tượng thay thế (MOCK Object) Các kinh nghiệm trong Unit Test Các công cụ hỗ trợ

Citation preview

Page 1: UNIT TEST Nhm 10

UNIT TESTNhóm 10

1

Page 2: UNIT TEST Nhm 10

Các nội dung chính

Định nghĩa Unit TestTầm quan trọng Unit TestPhương pháp xây dựng Unit TestCác đối tượng thay thế (MOCK Object)Các kinh nghiệm trong Unit TestCác công cụ hỗ trợ

2

Page 3: UNIT TEST Nhm 10

Unit Test là gì?

- Unit Testing, kiểm tra từng bộ phận rất nhỏ, từng unit riêng biệt trong source code của chương trình để kiểm tra xem nó có hoạt động chính xác không.

- Từ những bộ phận nhỏ này, ta lại kiểm tra những unit lớn hơn có sử dụng những unit nhỏ đã được kiểm tra đó.

3

Page 4: UNIT TEST Nhm 10

Unit Test

- Một Unit Test là một phần của source code, thực thi một phần code chính khác và so sánh kết quả thực tế với kết quả mong đợi.

- Được thực hiện bởi các lập trình viên.- Có thể làm bằng tay (Manual Unit Test) hoặc

tự động (Automated Unit Test)

4

Page 5: UNIT TEST Nhm 10

Tầm quan trọng Unit Test

• Lợi ích của Unit Test:- Đảm bảo chất lượng từng Unit trong phần mềm.- Phát hiện lỗi sớm và chỉnh sửa kịp thời- Giảm chi phí- Tái sử dụng được- Giúp chúng ta Design

5

Page 6: UNIT TEST Nhm 10

Phương pháp xây dựng Unit Test

Quá trình thực hiện Unit TestUnit test nên được xây dựng cho mỗi module sau khi kiểm tra xong mã nguồn.

6

Page 7: UNIT TEST Nhm 10

Phương pháp xây dựng Unit Test

Thiết kế UT: theo trình tự sau:• Thiết lập các điều kiện cần thiết: khởi tạo

các đối tượng, xác định tài nguyên cần thiết, xây dựng các dữ liệu giả…

• Triệu gọi các phương thức cần kiểm tra.• Kiểm tra sự hoạt động đúng đắn của các

phương thức.• Dọn dẹp tài nguyên sau khi kết thúc kiểm

tra.7

Page 8: UNIT TEST Nhm 10

Phương pháp xây dựng Unit Test

Có 2 kỹ thuật phổ biến:

- Black box testing

- White box testing

8

Page 9: UNIT TEST Nhm 10

Phương pháp xây dựng Unit Test • Phân tích các tình huống có thể xảy ra đối với mã. • Mọi UT phải bắt đầu với trạng thái “fail” và chuyển

trạng thái “pass” sau một số thay đổi hợp lý đối với mã chính.

• Khi viết một đoạn mã quan trọng, hãy viết các UT tương ứng.

• Số lượng Test Case đủ lớn để phát hiện điểm yếu của mã theo nguyên tắc:– Nếu nhập giá trị đầu vào hợp lệ thì kết quả trả về cũng phải

hợp lệ– Nếu nhập giá trị đầu vào không hợp lệ thì kết quả trả về phải

không hợp lệ9

Page 10: UNIT TEST Nhm 10

Phương pháp xây dựng Unit Test • Sớm nhận biết các đoạn mã không ổn định và có

nguy cơ gây lỗi cao, viết UT tương ứng để khống chế.• Nên tạo ra một lớp kiểm tra riêng vì những lỗi nghiêm

trọng có thể phát sinh từ các đối tượng quan trọng.• Nên kiểm tra lại các UT cũ, sau một thời gian code.• Sử dụng nhiều phương thức kiểm tra khác nhau. Hãy

viết càng đơn giản càng tốt.• Cuối cùng, viết UT cũng đòi hỏi sự nỗ lực, kinh

nghiệm và sự sáng tạo như viết PM.

10

Page 11: UNIT TEST Nhm 10

MOCK OBJECTS (Đối tượng thay thế)

Các định nghĩa(what):1. “A mock object is simply a debug replacement for

a real-world object”(Andy Hunt, Dave Thomas – Pragmatic unit testing in java with Junit)

2. “A mock object is an object created to stand in for an object that your code will be collaborating with. Your code can call methods on the mock object, which will deliver results as set up by your tests.”

(Source: JUnit in Action, Vincent Massol)11

Page 12: UNIT TEST Nhm 10

Đăc điểm• Đơn giản hơn đối tượng thực nhưng vẫn

giữ được sự tương tác với các đối tượng khác.

• Không lặp lại nội dung đối tượng thực.

• Cho phép thiết lập các trạng thái riêng trợ giúp kiểm tra.

12

Page 13: UNIT TEST Nhm 10

MOCK OBJECTS(tt)Sử dụng mocks khi nào thì thích hợp(when):• Có thể sử dụng “mock object” để mô phỏng các đối

tượng thật(real object) sau: - Không có hành vi cụ thể => không thể đoán trước

kết quả- Khó cài đặt- Xử lý chậm- Khó xảy ra và dễ gây lỗi- Object liên quan giao diện người dùng- Object chưa tồn tại dạng mã (mới trên bản thiết kế)

13

Page 14: UNIT TEST Nhm 10

MOCK OBJECTS(tt)

Thiết kế (how):- 3 bước quan trọng để sử dụng các đối tượng thay thế

trọng kiểm thử:

1. Đưa ra interface để mô tả đối tượng.

2. Viết nội dung cho đối tượng thực dựa trên interface

3. Trích interface từ đối tượng thật và triển khai mock object(MO) dựa trên interface đó.

14

Page 15: UNIT TEST Nhm 10

MOCK Object

15

INTERFACE

REAL CLASS

MOCK CLASS

TESTED FUNCTION

Page 16: UNIT TEST Nhm 10

Các Dạng Mocks

1. Stubs2. Mock3. Test a servlet

Có thể dùng nhiều kĩ thuật để test các module trong chương trình:

16

Page 17: UNIT TEST Nhm 10

Simple Stubs• Giả sử gọi hàm getTime() để trả về thời gian hiện tại:public long getTime(){

return System.currentTimemillis();}

public long getTime(){

if(debug){

return debug_cur_time;}else{

return System.currentTimemillis();}

} 17

Page 18: UNIT TEST Nhm 10

Mock

Tạo 1 interface:

public interface Environmental {

public long getTime();// Other methods omitted...

}

Kiểm thử 1 lớp truy xuất cơ sở dữ liệu:

public class RealDAO

{

public string getName( long id)

{

//….

}

}

18

Page 19: UNIT TEST Nhm 10

MOCK(tt)Áp dụng class interface cho lớp muốn kiểm thử:

public class SystemEnvironment implements Environmental {

public long getTime() {

return System.currentTimeMillis();}// other methods ...

}19

Page 20: UNIT TEST Nhm 10

MOCK(tt)Tạo class mock kế thừa từ interface này:

public class MockSystemEnvironmentimplements Environmental {

public long getTime() {return current_time;}

public void setTime(long aTime) {current_time = aTime;

}private long current_time;// ...

}20

Page 21: UNIT TEST Nhm 10

Sử dụng mock để kiểm thử các chức năng liên quan:

MOCK(tt)

public class PrintBill{ public static string Print(string name) { string result; if (name == "XDPM") { result = "Xin dung phun em"; } else { result = "Unknown"; } return result; }}

21

Page 22: UNIT TEST Nhm 10

MOCK(tt)[TestFixture]public class PrintTest{ [Test] public void XDPMTest() { MockDAO mock = new MockDAO(); string actualValue = PrintBill.Print(mock.GetName(0));

Assert.That(actualValue, Is.EqualTo("Xay dung phan mem"));

}}

22

Page 23: UNIT TEST Nhm 10

Test a Servlet

Là những khối lệnh của 1 web server quản lý.

Yêu cầu các URLs xác định chuyển đến container servlet.

Các URL lần lượt gọi các code servlet.Sau đó servlet gửi 1 reponse tới các trình

duyệt yêu cầu.

23

Page 24: UNIT TEST Nhm 10

Test a Servlet(tt) public void doGet(HttpServletRequest req,HttpServletResponse res)

throws ServletException, IOException{

String str_f = req.getParameter("Fahrenheit"); res.setContentType("text/html");

PrintWriter out = res.getWriter();try {

int temp_f = Integer.parseInt(str_f);double temp_c = (temp_f - 32)*5.0 /9.0;out.println("Fahrenheit: " + temp_f +", Celsius: " + temp_c);g catch (NumberFormatException e) fout.println("Invalid temperature: " + str_f);

}}

24

Page 25: UNIT TEST Nhm 10

Test a Servler(tt)Line 1

import junit.framework.* import com.mockobjects.servlet.*; public class TestTempServlet extends TestCase {

5 public void test_bad_parameter() throws Exception { TemperatureServlet s = new TemperatureServlet(); MockHttpServletRequest request = new MockHttpServletRequest();

10 MockHttpServletResponse response = new MockHttpServletResponse(); request.setupAddParameter("Fahrenheit", "boo!"); response.setExpectedContentType("text/html");

15 s.doGet(request,response); response.verify(); assertEquals("Invalid temperature: boo!nn", response.getOutputStreamContents());

}20

public void test_boil() throws Exception { TemperatureServlet s = new TemperatureServlet(); MockHttpServletRequest request = new MockHttpServletRequest();

25 MockHttpServletResponse response = new MockHttpServletResponse(); request.setupAddParameter("Fahrenheit", "212"); response.setExpectedContentType("text/html");

30 s.doGet(request,response); response.verify(); assertEquals("Fahrenheit: 212, Celsius: 100.0nn", response.getOutputStreamContents());

}35}

25

Page 26: UNIT TEST Nhm 10

Ưu điểm

1. Đảm bảo tính chính xác của chương trình

2. Phát hiện lỗi ngay từ những phase đầu tiên trong quá trình phát triển phần mềm

3. Sửa đổi dễ dàng hơn4. Tăng khả năng tích hợp code

26

Page 27: UNIT TEST Nhm 10

Nhược điểm

1. Gây khó khăn trong việc thực hiện chuyển đổi giữa đối tượng thật và đối tượng thay thế(mocks)

2. Không thể lường trước những vấn đề có thể xảy ra khi kết hợp các module với nhau

3. Phải duy trì mô hình(maintain the mock)

27

Page 28: UNIT TEST Nhm 10

Các kinh nghiệm trong Unist test

28

Các test độc lập

Unit test đảm bảo đầy đủ và không ảnh hưởng

lẫn nhau

Unit test phải đơn giản để thực hiện

Các Unit test phải nhỏ và nhanh

Test mỗi chức năng một lần

Thiết kế code và test đúng phương pháp

Tên của Test phải rõ ràng, chính xác

Sửa lỗi ngay khi được phát hiện

Page 29: UNIT TEST Nhm 10

Các công cụ hỗ trợ

- Junit- CppUnit- Cunit- EasyMock- HtmlUnit- HttpUnit- NUnit- v.v…

29

Page 30: UNIT TEST Nhm 10

Demo NUnit

30