31
Unit test Thành viên: Hà quang ngọc ẩn 08110183 Lê lâm bằng 081101 Nguyễn hoàng tuấn dương 0811 Contents 1. Giới thiệu Unit Test..............................................2 2. Tool và framework hỗ trợ unit test:...............................2 3. Sơ lược về Junit:.................................................2 4. DEMO:.............................................................2 a. Unit Test trong Visual Studio:..................................2 b. Unit Test trong Eclipse........................................10 5. Giải thích 1 số lệnh Assert thông dụng:..........................22

Unit Test Guide

Embed Size (px)

Citation preview

Page 1: Unit Test Guide

Unit test

Thành viên:

Hà quang ngọc ẩn 08110183

Lê lâm bằng 081101

Nguyễn hoàng tuấn dương 0811

Contents1. Giới thiệu Unit Test..............................................................................................................................2

2. Tool và framework hỗ trợ unit test:....................................................................................................2

3. Sơ lược về Junit:..................................................................................................................................2

4. DEMO:.................................................................................................................................................2

a. Unit Test trong Visual Studio:..........................................................................................................2

b. Unit Test trong Eclipse...................................................................................................................10

5. Giải thích 1 số lệnh Assert thông dụng:.............................................................................................22

Page 2: Unit Test Guide

1. Gi i thi u Unit Testớ ệ» Là phương pháp kiểm lỗi các module (unit) của mã nguồn.

˃ Trong lập trình thủ tục, unit có thể là 1 chương trình, hàm, thủ tục,…..

˃ Trong lập trình hướng đối tượng, đơn vị nhỏ nhất là phương thức của 1 lớp có thể là lớp trừu tượng, hoặc lớp con….

» Được tạo bởi lập developers hoặc đôi khi là white box tester suốt quá trình phát triển.

1. Tool và framework h tr unit test:ỗ ợa. NUnit: Là một unit-testing framework cho ngôn ngữ lập trình .NET được port từ Junit.

NUnit có hai dạng là console và GUI.b. JUnit: Tương tự như NUnit nhưng dùng framework của Java.c. TestDriven.NET: dùng cho .NET, sau khi cài sẽ tích hợp menu vào VS cho phép test,

debug.d. NCover, NCoverExplorer: các tool này giúp chúng ta kiểm soát mức độ cover của các

test case đối với source code, và cũng giống như NUnite. NMock, NMock2, Rhino Mock và TypeMock

2. S l c v Junit:ơ ượ ề» Là 1 testing framework dùng để viết test cho java project.» Nó là 1 thể hiện của kiến trúc xUnit cho unit test farmwork.» Junit có những tính năng sau:

˃ Assertions: để kiểm tra kết quả mong đợi.˃ Test fixtures: chia sể dữ liệu test chung.˃ Test suites: dễ dàng cho tổ chức và chạy test.˃ Graphical and textual test runners.

1. DEMO:

a. Unit Test trong Visual Studio:

Bước 1: Trong Visual Studio bạn tạo 1 project mới có kiểu là Class Library(các kiểu project khác đều được

nhưng ở đây việc tạo 1 class library sẽ cho bạn hình dung rằng bạn không thể thực thi module này 1 cách

độc lập để thử)

Page 3: Unit Test Guide

Bước 2: Thêm 1 Class mới bằng cách nhấn phải chuột lên Project trong Project Explorer, chọn Add-> Class,

đặt tên cho lớp đó là MyCalculator.

Bước 3: Coding các phương thức của bạn. ở đây giả sử tôi có các phương thức như sau:

using System;

namespace VoVanHai_UnitTesting

{

public class MyCalculator

{

public double Cong(int a, int b)

{

return a + b;

}

Page 4: Unit Test Guide

public double Tru(int a, int b)

{

return a – b;

}

public double Nhan(int a, int b)

{

return a * b;

}

public double Chia(int a, int b)

{

if (b == 0)

throw new Exception(“Lỗi chia cho zero”);

return a / b;

}

}

}

Build project, bạn được 1 file  UnitTest.dll.

OK, bây giờ bạn tạo 1 test project được rồi đấy!

Bước 4: Nhấn phải chuột lên Solution của bạn trong cửa sổ Solution Explorer, chọn Add-> New Project như

hình.

Page 5: Unit Test Guide

Chọn Test Project như hình rồi nhấn OK

Bạn có 1 Test Project như hình

Page 6: Unit Test Guide

Bạn có thể xỏa bỏ UnitTest1 nếu bạn muốn. Bây giờ ta có thể thêm vào 1 unit test mới bằng cách nhấn phải

chuột lên test project của chúng ta rồi chọn Add->Unit Test như hình:

Page 7: Unit Test Guide

Một của sổ hiện ra:

Page 8: Unit Test Guide

Nhấn OK, bạn sẽ có 1 lớp có tên MyCalculatorTest.cs với các phương thức test của bạn với các giá trị mặc

định (0). Ví dụ 1 phương thức:

[TestMethod()]

public void ChiaTest() { MyCalculator_Accessor target = new MyCalculator_Accessor(); // TODO: Initialize to an appropriate value int a = 0; // TODO: Initialize to an appropriate value int b = 0; // TODO: Initialize to an appropriate value double expected = 0F; // TODO: Initialize to an appropriate value double actual; actual = target.Chia(a, b); Assert.AreEqual(expected, actual); Assert.Inconclusive("Verify the correctness of this test method."); }

Bạn phải chọn các testcase nào đó theo 1 phương pháp bạn đang tuân thủ(chẳng hạn path testing chẳng

hạn). Bạn cần sửa lại đoạn code này theo 1 test case gồm có tham số đầu vào và kết quả mong đợi. Ví dụ với

Page 9: Unit Test Guide

phương thức trên bạn nhập tham số a=10, tham số b=10 thì bạn mong ước nhận được kết quả 100. Code đã

sửa như sau:

[TestMethod()]

public void ChiaTest() { MyCalculator_Accessor target = new MyCalculator_Accessor(); // TODO: Initialize to an appropriate value int a = 10; // TODO: Initialize to an appropriate value int b = 10; // TODO: Initialize to an appropriate value double expected = 1; // TODO: Initialize to an appropriate value double actual; actual = target.Chia(a, b); Assert.AreEqual(expected, actual); }

Nhấn chuột phải lên vị trí tại Testcase mà ta cần chạy thử, chọn Run Test.

Kết quả được cho như sau

Trong trường hợp bây giờ bạn cho a=10, b=5, kết quả mong đợi 100 thì bạn sẽ có kết quả:

Page 10: Unit Test Guide

Double click vào test result ta có cửa sổ sau chỉ ra chi tiết của lỗi sai:

b. Unit Test trong Eclipse

(tham khảo trên mạng)

Viết phương thức kiểm tra độ dài 3 cạnh có hợp thành 1 tam giác không ? nếu có đó là tam giác gì?

Sinh các Testcases dựa vào phương pháp lập bảng quyết định.

Trước hết ta viết chương trình kiểm tra tam giác như sau:

Trong eclipse, tạo 1 java project có tên JunitTest_Eclipse như hình:

Page 11: Unit Test Guide

Nhấn Finish Thêm 1 lớp mới

Page 12: Unit Test Guide
Page 13: Unit Test Guide

Đặt tên là Triangle

Tiến hành code cho lớp Triangle này như sau:

package vovanhai.wordpress.com;

public class Triangle {

private int a;

private int b;

private int c;

Page 14: Unit Test Guide

public Triangle(int a, int b, int c) throws Exception{

if(a<=0||b<=0||c<=0)

throw new Exception("dữ liệu không hợp lệ");

this.a = a;

this.b = b;

this.c = c;

} /**

* Hàm kiểm tra 1 có phải là tam giác không. Nếu có là loại tam giác gì?

* @param a

* @param b

* @param c

* @return -1:không phải tam giác

* 0:tam giác thường

* 1:tam giác cân

* 2:tam giác đều

*/

public int CheckTriangle(){

boolean isTriangle=false;

if(a<b+c&&b<a+c&&c<a+b)

isTriangle=true;

if(isTriangle){

if(a==b&&b==c)

Page 15: Unit Test Guide

return 2;//tam giác đều

else if(a!=b&&a!=c&&b!=c)

return 0;//tam giác thường

else

return 1;//tam giác cân

}

return -1;//không phải tam giác

}

} phương thức kiểm tra độ dài 3 cạnh có hợp thành 1 tam giác không ? nếu có đó là tam giác gì?

Sinh các Testcases dựa vào phương pháp lập bảng quyết định.

Trước hết ta viết chương trình kiểm tra tam giác như sau:

Trong eclipse, tạo 1 java project có tên JunitTest_Eclipse như hình:

Bây giờ ta tìm các testcases dựa vào phương pháp bảng quyết định Lập bảng quyết định:

Từ bảng quyết định, ta có thể dẫn xuất các testcase như sau: Test case a b c Expected

Page 16: Unit Test Guide

output1 4 1 2 Không phải tam

giác2 1 4 2 Không phải tam

giác3 1 2 4 Không phải tam

giác4 5 5 5 Tam giác đều5 ? ? ? Không khả dĩ6 ? ? ? Không khả dĩ7 2 2 3 Tam giác cân8 ? ? ? Không khả dĩ9 2 3 2 Tam giác cân10 3 2 2 Tam giác cân11 3 4 5 Tam giác

thườngBây giờ ta tiến hành tạo các unit test. Nhấn phải chuột lên project, chọn New->Junit Test Case

Ta được

Page 17: Unit Test Guide

Chú ý ở đây ta dùng JUnit version 4x (dùng anotation thay vì extends từ lớp TestCase như ở JUnit version 3x). Nhấn Next

Page 18: Unit Test Guide

Nhấn Finish

Cấu trúc project của chúng ta bây giờ như sau:

Page 19: Unit Test Guide

Code của lớp Triangle_Test như sau:

package vovanhai.wordpress.com.test;

import junit.framework.Assert;

import org.junit.Test;

import vovanhai.wordpress.com.Triangle;

public class Triangle_Test {

@Test

public void testcase1() throws Exception{

Triangle t=new Triangle(4, 1, 2);

int expected=-1;

int actual=t.CheckTriangle();

Assert.assertEquals(expected, actual);

}

@Test

public void testcase2() throws Exception{

Triangle t=new Triangle(1, 4, 2);

int expected=-1;

int actual=t.CheckTriangle();

Assert.assertEquals(expected, actual);

Page 20: Unit Test Guide

}

@Test

public void testcase3() throws Exception{

Triangle t=new Triangle(1,2, 4);

int expected=-1;

int actual=t.CheckTriangle();

Assert.assertEquals(expected, actual);

}

@Test

public void testcase4() throws Exception{

Triangle t=new Triangle(5, 5, 5);

int expected=2;

int actual=t.CheckTriangle();

Assert.assertEquals(expected, actual);

}

@Test

public void testcase5() throws Exception{

Triangle t=new Triangle(2, 2, 3);

int expected=1;

int actual=t.CheckTriangle();

Assert.assertEquals(expected, actual);

}

Page 21: Unit Test Guide

@Test

public void testcase6() throws Exception{

Triangle t=new Triangle(2, 3, 2);

int expected=1;

int actual=t.CheckTriangle();

Assert.assertEquals(expected, actual);

}

@Test

public void testcase7() throws Exception{

Triangle t=new Triangle(3, 2, 2);

int expected=1;

int actual=t.CheckTriangle();

Assert.assertEquals(expected, actual);

}

@Test

public void testcase8() throws Exception{

Triangle t=new Triangle(3, 4,5);

int expected=0;

int actual=t.CheckTriangle();

Assert.assertEquals(expected, actual);

}

}

Page 22: Unit Test Guide

Chạy file này với Junit ta được:

Giả sử ở testcase 8, ta thay giá trị expected=1, thử chạy lại ta được

2. Gi i thích 1 s l nh Assert thông d ng:ả ố ệ ụ

assertEquals

public static void assertEquals(java.lang.String message, java.lang.Object expected,

Page 23: Unit Test Guide

java.lang.Object actual)

xác nhận 2 đối tượng có bằng nhau không. Nếu không, 1 AssertionError thông báo với thông điệp. If expected and actual are null, they are considered equal.Các tham số:message – chỉ định thông điệp AssertionError (null okay)expected – giá trị mong muốnactual – giá trị thực

assertEquals

public static void assertEquals(java.lang.Object expected, java.lang.Object actual)

xác nhận 2 đối tượng có bằng nhau không. Nếu không, 1 AssertionError không có thông điệp. If expected and actual are null, they are considered equal.Parameters:expected – giá trị mong muốnactual – giá trị thực

assertArrayEquals

public static void assertArrayEquals(java.lang.String message, java.lang.Object[] expecteds, java.lang.Object[] actuals) throws org.junit.internal.ArrayComparisonFailure

xác nhận 2 đối tượng có bằng nhau không. Nếu không, 1 AssertionError thông báo với thông điệp. If expecteds and actuals are null, they are considered equal. Các tham số:message - the identifying message for the AssertionError (null okay)expecteds – mảng các đối tượng hoặc mảng nhiều chiều các giá trị mong muốn.actuals - mảng các đối tượng hoặc mảng nhiều chiều các giá trị thực.thông báo:org.junit.internal.ArrayComparisonFailure

assertArrayEquals

public static void assertArrayEquals(java.lang.Object[] expecteds, java.lang.Object[] actuals)

xác nhận 2 đối tượng có bằng nhau không. Nếu không, 1 AssertionError thông báo. If expected and actual are null, they are considered equal.Các tham số:expecteds – mảng các đối tượng hoặc mảng nhiều chiều các giá trị mong muốn.actuals - mảng các đối tượng hoặc mảng nhiều chiều các giá trị thực.

Page 24: Unit Test Guide

assertArrayEquals

public static void assertArrayEquals(java.lang.String message, byte[] expecteds, byte[] actuals) throws org.junit.internal.ArrayComparisonFailure

xác nhận 2 mảng byte có bằng nhau không. Nếu không, 1 AssertionError thông báo với thông điệp.Các tham số:message – thông điệp AssertionError (null okay)expecteds – mảng byte với giá trị mong muốn.actuals - – mảng byte với giá trị thực.thông báo:org.junit.internal.ArrayComparisonFailure

assertArrayEquals

public static void assertArrayEquals(byte[] expecteds, byte[] actuals)

xác nhận 2 mảng byte có bằng nhau không. Nếu không, 1 AssertionError không có thông điệp.Parameters:expecteds - mảng byte với giá trị mong muốn.actuals - mảng byte với giá trị thực

assertArrayEquals

public static void assertArrayEquals(java.lang.String message, char[] expecteds, char[] actuals) throws org.junit.internal.ArrayComparisonFailure

xác nhận 2 mảng char có bằng nhau không. Nếu không, 1 AssertionError có thông điệp.Parameters:message – thông điệp cho AssertionError (null okay)expecteds – mảng char với giá trị mong muốn.actuals - mảng char với giá trị thựcthông báo:org.junit.internal.ArrayComparisonFailure

assertArrayEquals

Page 25: Unit Test Guide

public static void assertArrayEquals(char[] expecteds, char[] actuals)

xác nhận 2 mảng char có bằng nhau không. Nếu không, 1 AssertionError không có thông điệp.Parameters:expecteds – mảng char với giá trị mong muốn.actuals - mảng char với giá trị thực

assertArrayEquals

public static void assertArrayEquals(java.lang.String message, short[] expecteds, short[] actuals) throws org.junit.internal.ArrayComparisonFailure

xác nhận 2 mảng ngắn có bằng nhau không. Nếu không, 1 AssertionError  có thông điệp.Parameters:message - the identifying message for the AssertionError (null okay)expecteds – mảng ngắn với giá trị mong muốn.actuals - mảng ngắn với giá trị thựcThrows:org.junit.internal.ArrayComparisonFailure

assertArrayEquals

public static void assertArrayEquals(short[] expecteds, short[] actuals)

xác nhận 2 mảng ngắn có bằng nhau không. Nếu không, 1 AssertionError  không có thông điệp.Parameters:expecteds – mảng ngắn với giá trị mong muốn.actuals - mảng ngắn với giá trị thực

assertArrayEquals

public static void assertArrayEquals(java.lang.String message, int[] expecteds, int[] actuals) throws org.junit.internal.ArrayComparisonFailure

xác nhận 2 mảng int có bằng nhau không. Nếu không, 1 AssertionError  có thông điệp.Parameters:message - the identifying message for the AssertionError (null okay)

Page 26: Unit Test Guide

expecteds – mảng int với giá trị mong muốn.actuals - mảng int với giá trị thựcThrows:org.junit.internal.ArrayComparisonFailure

assertArrayEquals

public static void assertArrayEquals(int[] expecteds, int[] actuals)

xác nhận 2 mảng int có bằng nhau không. Nếu không, 1 AssertionError  không có thông điệp.Parameters:expecteds – mảng int với giá trị mong muốn.actuals - mảng int với giá trị thực

assertArrayEquals

public static void assertArrayEquals(java.lang.String message, long[] expecteds, long[] actuals) throws org.junit.internal.ArrayComparisonFailure

xác nhận 2 mảng long có bằng nhau không. Nếu không, 1 AssertionError  có thông điệp.Parameters:message - the identifying message for the AssertionError (null okay)expecteds – mảng long với giá trị mong muốn.actuals - mảng long với giá trị thựcThrows:org.junit.internal.ArrayComparisonFailure

assertArrayEquals

public static void assertArrayEquals(long[] expecteds, long[] actuals)

xác nhận 2 mảng long có bằng nhau không. Nếu không, 1 AssertionError  không có thông điệp.Parameters:expecteds – mảng long với giá trị mong muốn.actuals - mảng long với giá trị thực

assertEquals

Page 27: Unit Test Guide

public static void assertEquals(java.lang.String message, double expected, double actual, double delta)

xác nhận 2 số thực có bằng nhau bên trong 1 số dương delta không. Nếu không, 1 AssertionError thông báo có thông điệp. If the expected value is infinity then the delta value is ignored. NaNs are considered equal: assertEquals(Double.NaN, Double.NaN, *) passesParameters:message - the identifying message for the AssertionError (null okay)expected – giá trị mong muốnactual – giá trị kiểm tra đối với giá trị expecteddelta – số delta lớn nhất giữa expected và actual tới lúc 2 số vẫn bằng nhau.

assertEquals

public static void assertEquals(long expected, long actual)

xác nhận 2 số long có bằng không. Nếu không, 1 AssertionError không có thông báo.Parameters:expected - expected long value.actual - actual long value

assertEquals

public static void assertEquals(java.lang.String message, long expected, long actual)

xác nhận 2 số long có bằng không. Nếu không, 1 AssertionError có thông báo.Parameters:message - the identifying message for the AssertionError (null okay)expected - long expected value.actual - long actual value