Thời gian đầu, người ta thường do dự khi phải viết UT thay vì tập trung vào viết mã cho các chức năng nghiệp vụ. Công việc viết UT có thể ngốn nhiều thời gian, tuy nhiên UT đem lại lợi ích to lớn như:
Tạo ra môi trường lý tưởng để kiểm tra bất kỳ đoạn mã nào, có khả năng thăm dò và phát hiện lỗi chính xác, duy trì sự ổn định của toàn bộ phần mềm và giúp tiết kiệm thời gian so với công việc gỡ rối truyền thống.
Phát hiện các thuật toán thực thi không hiệu quả, các thủ tục chạy vượt quá giới hạn thời gian.
Phát hiện các vấn đề về thiết kế, xử lý hệ thống, thậm chí các mô hình thiết kế.
Phát hiện các lỗi nghiêm trọng có thể xảy ra trong những tình huống rất hẹp.
Tạo hàng rào an toàn cho các khối mã: Bất kỳ sự thay đổi nào cũng có thể tác động đến hàng rào này và thông báo những nguy hiểm tiềm tàng.
UT là môi trường lý tưởng để tiếp cận các thư viện API bên ngoài một cách tốt nhất. Sẽ rất nguy hiểm nếu chúng ta ứng dụng ngay các thư viện này mà không kiểm tra kỹ lưỡng công dụng của các thủ tục trong thư viện. Dành ra thời gian viết UT kiểm tra từng thủ tục là phương pháp tốt nhất để khẳng định sự hiểu đúng đắn về cách sử dụng thư viện đó. Ngoài ra, UT cũng được sử dụng để phát hiện sự khác biệt giữa phiên bản mới và phiên bản cũ của cùng một thư viện.
Trong môi trường làm việc cạnh tranh, UT còn có tác dụng rất lớn đến năng suất làm việc:
Giải phóng chuyên viên QA khỏi các công việc kiểm tra phức tạp.
Tăng sự tự tin khi hoàn thành một công việc. Chúng ta thường có cảm giác không chắc chắn về các đoạn mã của mình như liệu các lỗi có quay lại không, hoạt động của module hiện hành có bị tác động không, hoặc liệu công việc hiệu chỉnh mã có gây hư hỏng đâu đó...
Là công cụ đánh giá năng lực của bạn. Số lượng các tình huống kiểm tra (test case) chuyển trạng thái "pass" sẽ thể hiện tốc độ làm việc, năng suất của bạn. Chiến lược viết mã hiệu quả với UT:
Phân tích các tình huống có thể xảy ra đối với mã. Đừng bỏ qua các tình huống tồi tệ nhất có thể xảy ra, thí dụ dữ liệu nhập làm một kết nối cơ sở dữ liệu thất bại, ứng dụng bị treo vì một phép toán chia cho không, các thủ tục đưa ra lỗi ngoại lệ sai có thể phá hỏng ứng dụng một cách bí ẩn...
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.
Mỗi khi viết một đoạn mã quan trọng, hãy viết các UT tương ứng cho đến khi bạn không thể nghĩ thêm tình huống nào nữa.
Nhập một số lượng đủ lớn các giá trị đầu vào để 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ệ
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ế.
Ứng với mỗi đối tượng nghiệp vụ (business object) hoặc đối tượng truy cập dữ liệu (data access object), 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 này.
Để ngăn chặn các lỗi có thể phát sinh trở lại thực thi tự động tất cả UT mỗi khi có một sự thay đổi quan trọng, hãy làm công việc này mỗi ngày. Các UT lỗi cho chúng ta biết thay đổi nào là nguyên nhân gây lỗi.
Để tăng hiệu quả và giảm rủi ro khi viết các UT, cần 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. Trước khi kết thúc phần này, chúng tôi có một lời khuyên là viết UT cũng tương tự như viết mã một chương trình, điều bạn cần làm là không ngừng thực hành. Hãy nhớ UT chỉ thực sự mang lại lợi ích nếu chúng ta đặt vấn đề chất lượng phần mềm lên hàng đầu hơn là chỉ nhằm kết thúc công việc đúng thời hạn.
CHƯƠNG 2: CÔNG CỤ KIỂM THỬ NUnit 2.1. GIỚI THIỆU:
NUnit là một tool mới ,có nhiều version khác nhau,trong đó NUnit version 2.5 mới phát hành vào tháng 2/2008 nên cũng còn mới lạ với nhiều người,đặc biệt phiên bản này hỗ trợ cho bộ .NET frameword của Microsoft.
NUnit có hai cách khác nhau để chạy chương trình thử nghiệm
+Console runer:NUnit –console.exe là khởi chạy nhanh nhất nhưng không phải là tương tác
+NUnit-Gui.exe:là một hình thức cho phép bạn lựa chọn làm việc với các bài test của bạn và cung cấp các thông tin phản hồi đồ họa.
2.2. NUnit-Console
The NUnit-console.exe chương trình là một văn bản dựa trên runner và có thể được sử dụng khi bạn muốn chạy tất cả các bài thi của bạn và không cần phải có màu đỏ /màu vàng / xanh chỉ của thành công hay thất bại. Nó rất hữu ích cho tự động hóa của bài thi và tích hợp vào các hệ thống khác. Nó tự động lưu kết quả của nó trong định dạng XML, cho phép bạn để sản xuất các báo cáo hay xử lý các kết quả. Sau đây là một ảnh chụp màn hình của chương trình.
2.3. NUnit gui runner
Là một chương trình đồ họa nunit.exe runner. Điều đó cho các bài kiểm tra trong một thám hiểm-như cửa sổ trình duyệt và cung cấp một hình ảnh chỉ biểu của thành công hay thất bại của các bài kiểm tra. Nó cho phép bạn lựa chọn để chạy một bài kiểm tra hoặc một lớp nào đó và tự động reload khi bạn chỉnh sửa và biên soạn lại mã của bạn. Sau đây là một ảnh chụp màn hình của NUnit chạy cùng một thử- assembly.dll
2.4 Lớp Assert
Lớp Assert được sử dụng trong các kiểm thử để khẳng định một điều kiện đã được biết đến. Ví dụ, sau khi chạy một số logic, để khẳng định rằng kết quả trả về có giá trị như dự kiến, thì sử dụng phương thức Assert.Equals.
Các phương thức trong lớp Assert: Phương thức tĩnh:
AssertEquals: Sử dụng Assert.Equals (Đối tượng dự kiến, Đối tượng thực tế)
AssertFalse: Sử dụng Assert.False (bool Expression)
AssertNotEquals: Sử dụng Assert.NotEquals (Object obj1, Object obj2)
AssertTrue: Sử dụng Assert.True (bool expression
Contains: Khẳng định rằng một chuỗi là thành viên của một mảng chuỗi. Các tìm kiếm là trường hợp nhạy cảm(sensitive).
Fail: Gọi phương thức này ngay lập tức, phải có ném một ngoại lệ. Được sử dụng cho các trường hợp ngoại lệ.
False: Xác minh cho dù biểu hiện là 'sai'.
Greater: Khẳng định rằng một đối tượng mạnh hơn là một đối tượng khác. Cả hai đối tượng phải cùng một kiểu, và kiểu đó phải thực thi các giao diện System.Icomparable
Less: Xác nhận rằng một đối tượng yếu hơn một đối tượng khác. Cả hai đối tượng phải cùng một kiểu, và kiểu đó phải thực thi các giao diện System.IComparable.
NotEquals: Khẳng định hai đối tượng là không bằng nhau. NotNull: Khẳng định không phải là đối tượng rỗng.
Null: Khẳng định một tham chiếu là 'rỗng'.
ReferenceEquals: Khẳng định rằng đối tượng tham chiếu đề cập đến một đối tượng giống như vậy.
StartsWith: Khẳng định rằng một chuỗi bắt đầu với việc cộng chuỗi. Sự kiểm tra này là trường hợp nhạy cảm.
True: Xác minh cho dù biểu hiện là 'đúng'. Phương thức động:
Equals (inherited from Object): Xác định xem có chỉ định đối tượng là bằng đối tượng hiện hành.
GetHashCode (inherited from Object): Phục vụ như một hash chức năng cho một loại, thích hợp cho sử dụng trong các thuật toán hashing và dữ liệu cấu trúc giống như một bảng hash.
GetType (inherited from Object): Lấy kiểu của đối tượng hiện hành
ToString (inherited from Object): Trả về một kiểu chuỗi của đối tượng hiện hành.
Finalize (inherited from Object): Cho phép một đối tượng cố gắng thử với mã nguồn mở và thực hiện các hoạt động trước khi đối tượng phản đối lại do tập hợp các dữ liệu vô nghĩa hoặc không tương thích.
MemberwiseClone (inherited from Object): Tạo ra một bản sao của đối tượng hiện hành.
Assert Constructor: Khởi tạo một instance mới của lớp Assert
2.5 Các thuộc tính trong NUnit:
Phiên bản 1 của NUnit sử dụng phương pháp cổ điển để xác định các trường hợp kiểm thử dựa trên thừa kế và tên quy ước.Từ phiên bản 2.0, NUnit đã sử dụng các thuộc tính tùy chỉnh cho mục đích này.
2.5.1 ExpectedExceptionAttribute
Lớp ExpectedExceptionAttribute có thể được dùng để đánh dấu một kiểm thử, vì vậy mà khi không có ngoại lệ của một loại kiểu đã được ném, việc kiểm thử sẽ được báo cáo như là không thành công(failed). Nếu ngoại lệ đã được ném, việc kiểm thử sẽ được báo cáo vượt qua.
Một số phương thức trong lớp ExpectedExceptionAttribute:
ExpectedExceptionAttribute Constructor: Khởi tạo một đối tượng ExpectedExceptionAttribute. Sử dụng constructor này nếu nó là đủ khả năng để kiểm tra cho các loại ngoại lệ.
ExceptionType: Lấy các kiểu hệ thống dự kiến của các ngoại lệ. TypeId (inherited from Attribute ): Khi triển khai thực hiện trong một lớp bắt nguồn, lấy một định danh duy nhất cho Attribute (thuộc tính) này.
GetHashCode (inherited from Attribute ): Trả về mã băm
GetType (inherited from Object ): Lấy kiểu của đối tượng hiện hành.
IsDefaultAttribute (inherited from Attribute ): Khi ghi đè trong một lớp , trả lại một dấu hiệu cho dù giá trị này là giá trị mặc định cho các lớp bắt nguồn.
IsEqualTo: So sánh kiểu ngoại lệ với một kiểu ngoại lệ. Nếu thêm vào đó một ngoại lệ, đặc biệt là đối tượng đã được cung cấp, các ngoại lệ sẽ được so với nó.
Match (inherited from Attribute ): Khi ghi đè trong một lớp, trả lại một giá trị cho dù nó bằng một đối tượng xác định.
ToString (inherited from Object ): Trả về một kiểu chuỗi của đối tượng hiện hành.
Finalize (inherited from Object ): Cho phép một đối tượng cố gắng thử với mã nguồn mở và thực hiện các hoạt động trước khi đối tượng phản đối lại do tập hợp các dữ liệu vô nghĩa hoặc không tương thích.
MemberwiseClone (inherited from Object ): Tạo ra một bản sao của đối tượng hiện hành
2.5.2 FixtureSetUpAttribute
Lớp FixtureSetUpAttribute: Một phương thức trong một test fixture mà đã được đánh dấu với FixtureSetUpAttribute thì phương thức đó sẽ được gọi một lần trước khi chạy tất cả các test trong test fixture.
Một số phương thức trong lớp FixtureSetUpAttribute:
FixtureSetUpAttribute Constructor: Xây dựng một đối tượng FixtureSetUpAttribute
TypeId (inherited from Attribute): Khi triển khai thực hiện trong một lớp bắt nguồn, lấy một định danh duy nhất cho Attribute (thuộc tính) này.
GetHashCode (inherited from Attribute): Trả về mã băm.
GetType (inherited from Object): Lấy kiểu của đối tượng hiện hành.
IsDefaultAttribute (inherited from Attribute): Khi ghi đè trong một lớp , trả lại một dấu hiệu cho dù giá trị này là giá trị mặc định cho các lớp bắt nguồn.
Match (inherited from Attribute): Khi ghi đè trong một lớp, trả lại một giá trị cho dù nó bằng một đối tượng xác định.
ToString (inherited from Object): Trả về một kiểu chuỗi của đối tượng hiện hành.
Finalize (inherited from Object ): Cho phép một đối tượng cố gắng thử với mã nguồn mở và thực hiện các hoạt động trước khi đối tượng phản đối lại do tập hợp các dữ liệu vô nghĩa hoặc không tương thích.
MemberwiseClone (inherited from Object ): Tạo ra một bản sao của đối tượng hiện hành
2.5.3 Lớp FixtureTearDownAttribute
Lớp FixtureTearDownAttribute: Một phương thức trong một test fixture đã được đánh dấu với FixtureTearDownAttribute sẽ được gọi một lần sau khi chạy tất cả các test trong test Fixture.
Một số phương thức của lớp FixtureTearDownAttribute:
FixtureTearDownAttribute Constructor: Xây dựng một đối tượng FixtureSetUpAttribute.
TypeId (inherited from Attribute): Khi triển khai thực hiện trong một lớp bắt nguồn, lấy một định danh duy nhất cho Attribute (thuộc tính) này.
GetHashCode (inherited from Attribute): Trả về mã băm.
GetType (inherited from Object): Lấy kiểu của đối tượng hiện hành.
IsDefaultAttribute (inherited from Attribute): Khi ghi đè trong một lớp , trả lại một dấu hiệu cho dù giá trị này là giá trị mặc định cho các lớp bắt nguồn.
Match (inherited from Attribute): Khi ghi đè trong một lớp, trả lại một giá trị cho dù nó bằng một đối tượng xác định.
ToString (inherited from Object): Trả về một kiểu chuỗi của đối tượng hiện hành.
Finalize (inherited from Object ): Cho phép một đối tượng cố gắng thử với mã nguồn mở và thực hiện các hoạt động trước khi đối tượng phản đối lại do tập hợp các dữ liệu vô nghĩa hoặc không tương thích.
MemberwiseClone (inherited from Object ): Tạo ra một bản sao của đối tượng hiện hành.
2.5.4 IgnoreAttribute
Lớp IgnoreAttribute: IgnoreAttribute có thể được dùng để đánh dấu một test fixture hay một test. Khi đã đánh dấu cách này, test hay toàn bộ test fixture sẽ không được thực hiện.
Một số phương thức:
IgnoreAttribute Constructor: Xây dựng một đối tượng IgnoreAttribute. Khi đặt nó trên một kiểm thử, kiểm thử sẽ bị bỏ qua bởi csUnit trong suốt thời gian thực hiện thử nghiệm.
Reason: Lý do tại sao một đơn vị kiểm thử lại được bỏ qua. TypeId (inherited from Attribute): Khi triển khai thực hiện trong một lớp bắt nguồn, lấy một định danh duy nhất cho Attribute (thuộc tính) này. GetHashCode (inherited from Attribute): Trả về mã băm.
GetType (inherited from Object): Lấy kiểu của đối tượng hiện hành.
IsDefaultAttribute (inherited from Attribute): Khi ghi đè trong một lớp , trả lại một dấu hiệu cho dù giá trị này là giá trị mặc định cho các lớp bắt nguồn.
Match (inherited from Attribute): Khi ghi đè trong một lớp, trả lại một giá trị cho dù nó bằng một đối tượng xác định.
ToString (inherited from Object): Trả về một kiểu chuỗi của đối tượng hiện hành.
Finalize (inherited from Object ): Cho phép một đối tượng cố gắng thử với mã nguồn mở và thực hiện các hoạt động trước khi đối tượng phản đối lại do tập hợp các dữ liệu vô nghĩa hoặc không tương thích.
MemberwiseClone (inherited from Object ): Tạo ra một bản sao của đối tượng hiện hành.
2.5.5 SetUpAttribute
Lớp SetUpAttribute: Một phương thức trong một test fixture được đánh dấu với SetUpAttribute sẽ được thực hiện ngay lập tức trước mỗi test. Phương thức phải có kiểu “public void” Và nó phải không có bất kỳ tham số nào.
Một số phương thức:
SetUpAttribute Constructor: Xây dựng một đối tượng SetUpAttribute.
TypeId (inherited from Attribute): Khi triển khai thực hiện trong một lớp bắt nguồn, lấy một định danh duy nhất cho Attribute (thuộc tính) này. GetHashCode (inherited from Attribute): Trả về mã băm.
GetType (inherited from Object): Lấy kiểu của đối tượng hiện hành.
IsDefaultAttribute (inherited from Attribute): Khi ghi đè trong một lớp , trả lại một dấu hiệu cho dù giá trị này là giá trị mặc định cho các lớp bắt nguồn.
Match (inherited from Attribute): Khi ghi đè trong một lớp, trả lại một giá trị cho dù nó bằng một đối tượng xác định.
ToString (inherited from Object): Trả về một kiểu chuỗi của đối tượng hiện hành.
Finalize (inherited from Object ): Cho phép một đối tượng cố gắng thử với mã nguồn mở và thực hiện các hoạt động trước khi đối tượng phản đối lại do tập hợp các dữ liệu vô nghĩa hoặc không tương thích.
MemberwiseClone (inherited from Object ): Tạo ra một bản sao của đối tượng hiện hành.
2.5.6 TearDownAttribute
Lớp TearDownAttribute: Một phương thức được đánh dấu với TearDownAttribute sẽ được gọi ngay lập tức sau khi thực hiện của mỗi kiểm thử đơn. Phương thức phải có kiểu “public void” Và không có bất kỳ tham số nào.
Một số phương thức:
TearDownAttribute Constructor: Xây dựng một đối tượng TearDownAttribute
TypeId (inherited from Attribute): Khi triển khai thực hiện trong một lớp bắt nguồn, lấy một định danh duy nhất cho Attribute (thuộc tính) này. GetHashCode (inherited from Attribute): Trả về mã băm.
GetType (inherited from Object): Lấy kiểu của đối tượng hiện hành.
IsDefaultAttribute (inherited from Attribute): Khi ghi đè trong một lớp , trả lại một dấu hiệu cho dù giá trị này là giá trị mặc định cho các lớp bắt nguồn.
Match (inherited from Attribute): Khi ghi đè trong một lớp, trả lại một giá trị cho dù nó bằng một đối tượng xác định.
ToString (inherited from Object): Trả về một kiểu chuỗi của đối tượng hiện hành.
Finalize (inherited from Object ): Cho phép một đối tượng cố gắng thử với mã nguồn mở và thực hiện các hoạt động trước khi đối tượng phản đối lại do tập hợp các dữ liệu vô nghĩa hoặc không tương thích.
MemberwiseClone (inherited from Object ): Tạo ra một bản sao