Để củng cố kiến thức đã học và ứng dụng trong một số công việc cụ thể nên nhómchúng em đã được giao tìm hiểu về công cụ kiểm thử NUnit và ứng dụng để tiến hànhkiểm thử chương trình kiểm
TỔNG QUAN VỀ KIỂM THỬ PHẦN MỀM
Định nghĩa
Kiểm thử phần mềm có nhiều cách định nghĩa khác nhau Tuy nhiên, chúng cùng bao trùm hai nội dung cơ bản là phát hiện lỗi và đánh giá chất lượng của phần mềm Định nghĩa sau đây của Myers là đơn giản và có tính thực tế: “Kiểm thử là tiến trình thực thi chương trình với mục đích tìm thấy lỗi” Theo định nghĩa của Myers, kiểm thử mà không phát hiện được lỗi được coi là không thành công.
Mục đích của kiểm thử là phát hiện lỗi vì trong thực tế phần mềm hầu như không bao giờ không chứa lỗi.
Kỹ thuật kiểm thử phần mềm
Có thể chia các kỹ thuật kiểm thử thành hai loại: kỹ thật kiểm thử chức năng (Functional Testing) hay còn gọi là kỹ thật kiểm thử hộp đen (Black-box-Testing) và kỹ thật kiểm thử cấu trúc (Structutural Testing) hay còn gọi là kỹ thuật kiểm thử hộp trắng (White-box-Testing).
1.2.1 Kỹ thuật kiểm thử chức năng
Trong kỹ thuật kiểm thử chức năng, dữ liệu kiểm thử được xuất phát từ đặc tả phần mềm bao gồm: đặc tả các yêu cầu (đối với kiểm thử hệ thống), đặc tả thiết kế (đối với kiểm thử tích hợp) và đặc tả chi tiết mô-đun (đối với kiểm thử đơn vị) Trong kỹ thuật này, kiểm thử viên xem phần mềm như là một hộp đen Kiểm thử viên hoàn toàn không quan tâm cấu trúc và hành vi bên trong của phần mềm Kiểm thử viên chỉ cần quan tâm đến việc tìm các hiện tượng mà phần mềm không hành xử theo đúng đặc tả của nó.
Kiểm thử viên chỉ biết những gì phần mềm dự kiến thực hiện và những gì dự kiến không thực hiện, mà không thể nhìn vào bên trong xem nó hoạt động như thế nào Vì thế dữ liệu kiểm thử sẽ xuất phát từ đặc tả.
Kiểm thử chức năng cố gắng tìm các lỗi sau: thiếu chức năng, lỗi giao diện, lỗi cấu trúc dữ liệu, lỗi truy cập cơ sở dữ liệu, lỗi thi hành, lỗi khởi tạo hoặc kết thúc,…
1.2.2 Kỹ thuật kiểm thử cấu trúc
Kỹ thuật kiểm thử cấu trúc là kỹ thuật dựa trên sự phân tích mã chương trình hoặc một mô hình của mã chương trình để xây dựng các phép thử theo các tiêu chuẩn bao phủ.
Tìm hiểu về công cụ kiểm thử Nunit Chương 1: Tổng quan về kiểm thử phần mềm
Kỹ thuật kiểm thử cấu trúc cho phép chúng ra kiểm thử cấu trúc bên trong của phần mềm, với mục đích kiểm tra rất cả các câu lệnh và điểu kiện tồn tại trong phần mềm đó.Trong kỹ thuật này, kiểm thử viên lấy dữ liệu thử xuất phát từ việc kiểm tra logic của chương trình (không quan tâm đến đặc tả).
Các giai đoạn kiểm thử
Kỹ thuật kiểm thử cấu trúc cho phép chúng ra kiểm thử cấu trúc bên trong của phần mềm, với mục đích kiểm tra rất cả các câu lệnh và điểu kiện tồn tại trong phần mềm đó. Trong kỹ thuật này, kiểm thử viên lấy dữ liệu thử xuất phát từ việc kiểm tra logic của chương trình (không quan tâm đến đặc tả).
Một chiến lược kiểm thử (test strategy) là một kế hoạch định nghĩa mục tiêu các giai đoạn kiểm thử cũng như các kỹ thuật kiểm thử sử dụng Chiến lược kiểm thử thường được quyết định dựa vào tiêu chuẩn về độ tin cậy của phần mềm và chi phí cho việc phát triển phần mềm Ngoài ra, một chiến lược kiểm thử sẽ phụ thuộc kích thước của đối tượng được kiểm thử cũng như quan điểm về đối tượng được kiểm thử.
Nếu chúng ta muốn kiểm thử một cách độc lập các thành phần/đơn vị cấu tạo nên phần mềm, chúng ta gọi là kiểm thử đơn vị Nếu chúng ta muốn kiểm thử sự kết hợp các thành phần cấu tạo nên phần mềm, chúng ta gọi là kiểm thử tích hợp Nếu chúng ta muốn bảo đảm rằng một phần mềm đang được phát triển một cách đúng đắn và các thành phần cấu tạo nên phần mềm cũng được phát triển một cách đúng đắn, chúng ta gọi là xác minh (verification) Tuy nhiên, một phần mềm không chỉ đơn thuần là đáp ứng yêu cầu của nhà sản xuất, mà nó chỉ trở nên hữu ích nếu đáp ứng được nhu cầu của người sử dụng cuối cùng Việc bảo đảm một phần mềm đáp ứng nhu cầu của người sử dụng được gọi là hợp thức hoá (validation).
1.4.1 Kiểm thử đơn vị (Unit Testing)
Phần lớn các phương pháp thiết kế phần mềm đều dẫn đến chia phần mềm thành những mô- đun hay chương trình nhỏ có các dữ liệu vào và kết quả riêng Chúng ta gọi các mô-đun hay chương trình đó là các đơn vị (unit) phần mềm Trên các đơn vị này chúng ta sẽ tiến hành kiểm thử đơn vị.
Một khi đơn vị phần mềm đã được mã hoá, nghĩa là lập trình và hồ sơ kiểm thử đơn vị tương ứng đã được hoàn thành thì kiểm thử đơn vị có thể được tiến hành.
Kiểm thử đơn vị chủ yếu là thực hiện các trường hợp kiểm thử (test case) đã được mô tả trong hồ sơ kiểm thử đơn vị và điền các thông tin cần thiết vào các phiếu báo cáo kiểm thử Nếu một lỗi hay sự không tương thích được phát hiện, cần phải chỉnh sửa lại
Tìm hiểu về công cụ kiểm thử Nunit Chương 1: Tổng quan về kiểm thử phần mềm đơn vị phần mềm Sau đó, kiểm thử đơn vị được thực hiện lại Kiểm thử đơn vị sẽ kết thúc khi mà tất cả các trường hợp kiểm thử được mô tả trong hồ sơ kiểm thử đơn vị đã được thực hiện thành công và kết quả được lưu lại trong hồ sơ.
1.4.2 Kiểm thử tích hợp (Integration Testing)
Kiểm thử tích hợp được tiến hành một khi kiểm thử đơn vị các thành phần cần thiết cho kiểm thử tích hợp kết thúc và hồ sơ kiểm thử tích hợp đã được chuẩn bị sẵn sàng. Trong giai đoạn kiểm thử tích hợp, ý tưởng là các thành phần đã được kiểm thử đơn vị sẽ được tích hợp lại dần dần cho đến khi có được toàn bộ phần mềm Phần mềm càng phức tạp thì đòi hỏi giai đoạn kiểm thử tích hợp phải trải qua các giai đoạn trung gian, là các giai đoạn mà các nhóm các thành phần sẽ được kiểm thử.
Mục tiêu của giai đoạn kiểm thử tích hợp là kiểm tra sự giao tiếp và trao đổi dữ liệu giữa các thành phần phần mềm Trong giai đoạn tích hợp, có thể có khả năng phải sử dụng các thành phần không được phát triển trong dự án phần mềm, mà là những thành phần được cung cấp sẵn bởi các thư viện hay thậm chí là các thành phần được cung cấp bởi hệ điều hành.
Khi tích hợp các thành phần tạo thành tập hợp, chúng ta có thể tiến hành theo các chiến lược:
- Tích hợp từ trên xuống (top-down) bằng cách kiểm thử tích hợp các thành phần chính trước, sau đó thêm vào các thành phần được gọi trực tiếp bởi các thành phần vừa kiểm thử.
- Tích hợp từ dưới lên (bottom-up) bằng cách kiểm thử các thành phần không gọi các thành phần khác, sau đó thêm vào các thành phần gọi các thành phần vừa kiểm thử.
1.4.3 Kiểm thử hợp thức hóa (Validation Testing)
Kiểm thử hợp thức hoá có thể bắt đầu ngay sau khi kiểm thử tích hợp kết thúc và hồ sơ kiểm thử hợp thức hoá đã sẵn sàng Mục tiêu của kiểm thử hợp thức hoá là cần chỉ ra rằng phần mềm thực hiện đúng những gì mà người sử dụng mong đợi Vì thế, ở giai đoạn này, kiểm thử được thực hiện dưới góc nhìn của người sử dụng, chứ không phải dưới góc nhìn của người phát triển như các giai đoạn kiểm thử đơn vị hay kiểm thử tích hợp.
Tìm hiểu về công cụ kiểm thử Nunit Chương 1: Tổng quan về kiểm thử phần mềm
Vì kiểm thử được thực hiện dưới góc nhìn của người sử dụng nên giai đoạn này chỉ sử dụng các kỹ thuật kiểm thử chức năng, tức là các kỹ thuật kiểm thử hộp đen Các bộ dữ liệu thử sẽ được tạo ra dựa trên các tài liệu đặc tả Thông thường các tài liệu đặc tả sẽ được phân tích để xác định các yêu cầu chứa đựng các hành vi mong đợi của phần mềm.
1.4.4 Kiểm thử chấp nhận (Acceptance Testing) Được thực hiện khi tất cả các giai đoạn kiểm thử được hoàn tất nhằm để chứng minh phần mềm đã đủ sẵn sàng xuất xưởng Các thủ tục kiểm thử hoặc chạy thử phải được người đặt hàng chấp nhận trước khi thực hiện để nghiệm thu.
1.4.5 Kiểm thử hồi quy (Regression Testing)
Phần mềm là một trong những loại sản phẩm thay đổi rất nhanh Người sử dụng luôn có yêu cầu cải tiến phần mềm và các chức năng mới Vì vậy, sự chỉnh sửa phần mềm sau khi đưa vào sử dụng là cần thiết Mặt khác, bất kỳ sự sửa đổi nào cùng có thể dẫn đến các lỗi mới Phần mềm nhất thiết phải được kiểm thử lại sau khi sửa đổi, giai đoạn kiểm thử này gọi là kiểm thử hồi quy.
Một số vấn đề khác của kiểm thử phần mềm
1.5.1 Các hạn chế của kiểm thử
Do kiểm thử là chạy thử chương trình với tập dữ liệu giả nên không thể khẳng định tính đúng của chương trình do bản chất quy nạp không hoàn toàn của nó.
Trong nhiều trường hợp, việc kiểm thử thường được thực hiện từ những giai đoạn đầu của quá trình cài đặt sản phẩm.
Một chương trình được cho tuyệt đối đúng phải được thực hiện thông qua: tính đúng đắn của thuật toán và tính tương đương của chương trình với thuật toán (được thể hiện ở chứng minh thông qua văn bản chương trình).
Việc kiểm thử chương trình chỉ là nhìn sự kiện đưa ra kết luận do vậy không thể khẳng định một chương trình tuyệt đối đúng bằng kiểm thử Tuy vậy, bộ dữ liệu kiểm thử phải phủ kín mọi trường hợp cần đánh giá.
Tìm hiểu về công cụ kiểm thử Nunit Chương 1: Tổng quan về kiểm thử phần mềm
Thêm vào đó, trong quá trình kiểm thử, ta thường mắc phải các đặc trưng của nguyên lý chủ quan như sau:
- Bộ dữ liệu kiểm thử không thay đổi trong quá trình xây dựng phần mềm.
- Chỉ kiểm thử các trường hợp chính thống, hợp lệ, không quan tâm đến các cận và các sự cố.
- Cài đặt chức năng nào thì chỉ kiểm thử riêng chức năng đó, không kiểm thử tổng hợp chức năng vừa cài đặt với các chức năng đã cài đặt trước đó.
- Người kiểm thử đồng thời là người xây dựng phần mềm tức vừa đá bóng, vừa thổi còi.
1.5.2 Các nguyên tắc kiểm thử
Các nguyên tắc luôn đóng vai trò quan trọng trong lĩnh vực công nghệ phần mềm. Các nguyên tắc trong công nghệ phần mềm là các luật hay quy tắc hướng dẫn làm thế nào để xây dựng (thiết kế, phát triển, kiểm thử và bảo trì) phần mềm Kiểm thử là một trong những lĩnh vực của công nghệ phần mềm, kiểm thử cũng có các nguyên tắc riêng dành cho các kiểm thử viên Chúng ta sẽ xem xét một số nguyên tắc cơ bản liên quan đến kiểm thử động:
- Kiểm thử là tiến trình thực thi phần mềm và sử dụng các trường hợp kiểm thử để phát hiện lỗi.
- Với mục đích của kiểm thử nhằm phát hiện lỗi, một ca kiểm thử tốt là ca kiểm thử có khả năng cao phát hiện những lỗi chưa được tìm thấy.
- Một ca kiểm thử phải định nghĩa kết quả mong muốn.
- Kiểm thử nên được thực hiện bởi một nhóm độc lập với nhóm phát triển.
- Kết quả kiểm thử nên được kiểm tra một cách cẩn thận.
- Các ca kiểm thử nên được thiết kế cho cả những dữ liệu vào hợp lệ và không hợp lệ.
- Các ca kiểm thử phải được tái sử dụng.
- Xác suất tồn tại của các lỗi hơn nữa trong một đơn vị phần mềm tỷ lệ với số các lỗi đã được phát hiện trong đơn vị phần mềm đó.
- Kiểm thử nên phải được lập kế hoạch.
- Các hoạt động kiểm thử nên phải được tích hợp vào tiến trình phát triển phần mềm.
Tìm hiểu về công cụ kiểm thử Nunit Chương 1: Tổng quan về kiểm thử phần mềm
- Kiểm thử là một công việc đầy sáng tạo và thách thức.
1.5.3 Phân loại một số công cụ kiểm thử tự động
Vì kiểm thử phần mềm thường chiếm tới 40% tất cả các nỗ lực dành cho một dự án xây dựng phần mềm, nên công cụ có thể làm giảm thời gian kiểm thử sẽ rất có giá trị. Thừa nhận lợi ích tiềm năng này, các nhà nghiên cứu và người thực hành đã phát triển một số thế hệ các công cụ kiểm thử tự động:
Bộ phân tích tĩnh: Các hệ thống phân tích chương trình này hỗ trợ cho việc chứng minh các lý lẽ tĩnh - những mệnh đề yếu kém về cấu trúc và định dạng của chương trình.
Bộ thanh tra mã nguồn: Những bộ lọc chuyên dụng này được dùng để kiểm tra chất lượng của phần mềm để đảm bảo rằng nó đáp ứng các chuẩn mã hoá tối thiểu.
Bộ xử lý khẳng định: Những hệ thống tiền xử lý/hậu xử lý này được sử dụng để cho biết liệu những phát biểu do người lập trình nêu, được gọi là các khẳng định, về hành vi của chương trình có thực sự được đáp ứng trong việc thực hiện chương trình thực hay không.
Bộ sinh trường hợp kiểm thử: Những bộ xử lý này sinh ra, và điền các giá trị đã xác định vào các trường hợp kiểm thử cho chương trình đang được kiểm thử.
Bộ sinh dữ liệu kiểm thử: Những hệ thống phân tích tự động này hỗ trợ cho người dùng trong việc chọn dữ liệu kiểm thử làm cho chương trình hành xử theo một cách đặc biệt.
Bộ kiểm chứng kiểm thử: Những công cụ này đo mức bao quát kiểm thử bên trong, thường được diễn tả dưới dạng có liên quan tới cấu trúc điều khiển của sự vật kiểm thử, và báo cáo về giá trị bao quát cho chuyên gia đảm bảo chất lượng.
Dụng cụ kiểm thử: Lớp các công cụ này hỗ trợ cho việc xử lý các phép kiểm thử.
Bộ so sánh kết quả đầu ra: Công cụ này làm cho người ta có thể so sánh một tập kết quả đầu ra từ một chương trình này với một tập kết quả khác (đã được lưu giữ trước) để xác định sự khác biệt giữa chúng.
CÔNG CỤ KIỂM THỬ NUNIT
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.
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.
Hình 2.1 Giao diện Console của công cụ Nunit
Tìm hiểu về công cụ kiểm thử Nunit Chương 2: Công cụ kiểm thử NUnit
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 test một đoạn lệnh.
Hình 2.2 Giao diện đồ họa của công cụ Nunit
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: o NUnit.Framework.Assert.AreEqual o NUnit.Framework.Assert.False o NUnit.Framework.Assert.AreNotEqual
Tìm hiểu về công cụ kiểm thử Nunit Chương 2: Công cụ kiểm thử NUnit o NUnit.Framework.Assert.Contains o NUnit.Framework.Assert.True o NUnit.Framework.Assert.Fail o NUnit.Framework.Assert.Greater o NUnit.Framework.Assert.Less o NUnit.Framework.Assert.NotNull o NUnit.Framework.Assert.Null o NUnit.Framework.Assert.ReferenceEquals
- Phương thức động o 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. o GetType (inherited from Object): Lấy kiểu của đối tượng hiện hành. o ToString (inherited from Object): Trả về một kiểu chuỗi của đối tượng hiện hành. o 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. o MemberwiseClone (inherited from Object): Tạo ra một bản sao của đối tượng hiện hành. o Assert Constructor: Khởi tạo một instance mới của lớp Assert.
Các thuộc tính trong Nunit
Người ta thường tạo một project dạng class library dành cho các test class Project này theo đúng tên gọi của nó chỉ có ý nghĩa để test và không có vai trò gì trong sản phầm phần mềm cuối cùng Thực ra NUnit có thể test bất kí test class nào bên trong một assembly bất kì nên project test có thể là Console application, window application, v.v nhưng thông thường người ta sẽ chọn project loại class library Có một lưu ý là test class của bạn phải được khai báo public, test method cũng thế Khi sử dụng NUnit.Framework,
Tìm hiểu về công cụ kiểm thử Nunit Chương 2: Công cụ kiểm thử NUnit các bạn sẽ phải làm quen với những Attribute như [TestFixture], [Test], [Setup], [TearDown],…
- [TestFixture]: dùng để đánh đấu 1 class là test class, những class khác không có
Attribute này sẽ mặc định bị ignore khi NUnit test assembly của bạn.
- [Test]: dùng để đánh dấu 1 method là test method, ý nghĩa của nó tương tự như
TestFixture nhưng scope ở cấp method.
- [Setup]: dùng để đánh dấu một method sẽ được gọi trước khi môt test case được goi Nếu trong một test class có mười method test, thì mỗi lần một method test được chạy thì Nunit sẽ chạy method được đánh dấu với Setup trước tiên.
- [TearDown]: ngược với Setup, chạy sau mỗi test method.
- [TestFixtureSetup]: tương tự như Setup nhưng ở cấp của class, khi một test class được test thì methid nào được đánh dấu với attribute này sẽ được chạy trước tiên.
Vậy để apply NUnit Test thì công việc vô cùng đơn giản: tạo một project class library, thêm reference đến dll nunit.framework, thêm 1 class mới, khai báo nó thành public, thêm using nunit.framework, thêm attribute [TestFixture] vào đầu của class, viết một method test và khai báo với attribute [Test] Cơ bản như vậy là đủ để test, bạn có thể kết hợp nhiều attribute khác cũng như nguyên tắc Inheritance của lập trình hướng đối tượng để có một project test uyển chuyển Người ta thường sử dụng [Setup] để mở một transaction scope, sau đó dùng [TearDown] để roll back transaction khi test các Dao,như vậy sẽ không có dữ liệu bị thêm xóa vào database và bảo đảm dữ liệu test sẽ như nhau trước khi test các method.
Tìm hiểu về công cụ kiểm thử Nunit Chương 4: Hướng dẫn sử dụng công cụ NUnit
HƯỚNG DẪN SỬ DỤNG CÔNG CỤ NUNIT
Download và cài đặt công cụ
3.1.1 Download công cụ Để download và sử dụng công cụ, các bạn ghé thăm website: https://nunit.org/download/
Hình 3.1 Website download công cụ
Tìm hiểu về công cụ kiểm thử Nunit Chương 4: Hướng dẫn sử dụng công cụ NUnit
3.1.2 Cài đặt công cụ Để cài NUnit , trong Visual Studio 2019 chọn Tools > NuGet Package Manager > Manage NuGet Packages for Solution
Hình 3.2 Tiến trình cài đặt chương trình
Tìm hiểu về công cụ kiểm thử Nunit Chương 4: Hướng dẫn sử dụng công cụ NUnit
Trong cửa sổ NuGet – Solution chọn tab Browse và gõ cụm từ ‘nunit‘ trong ô tìm kiếm và chọn NUnit đầu tiên:
Hình 3.3 Tiến trình cài đặt chương trình (tiếp theo)
Bên khung cửa sổ NUnit bên phải chọn Project (bao gồm hai dự án) và nhấn Install:
Tìm hiểu về công cụ kiểm thử Nunit Chương 4: Hướng dẫn sử dụng công cụ NUnit
Hình 3.4 Tiến trình cài đặt chương trình (tiếp theo)
Nếu hộp thoại Preview Changes xuất hiện thì nhấn OK Nếu cài đặt thành công thì kết quả từ hộp thoại Output sẽ như sau:
Hình 3.5 Tiến trình cài đặt chương trình (tiếp theo)
Tìm hiểu về công cụ kiểm thử Nunit Chương 4: Hướng dẫn sử dụng công cụ NUnit Đóng cửa sổ NuGet – Solution và Output Trở lại cửa sổ Solution Explorer tìm đến mục
Reference của hai sự án sẽ xuấthiện nunit.framwork:
Hình 3.6 Tiến trình cài đặt chương trình (tiếp theo)
Tìm hiểu về công cụ kiểm thử Nunit Chương 4: Hướng dẫn sử dụng công cụ NUnit
Một cách tương tự, chúng ta cũng cài đặt NUnit3TestAdapter :
Hình 3.7 Kết thúc cài đặt chương trình
Giao diện chương trình sau khi cài đặt thành công
Tìm hiểu về công cụ kiểm thử Nunit Chương 4: Hướng dẫn sử dụng công cụ NUnit
Bắt đầu sử dụng chương trình
Chúng ta xây dựng một lớp thực hiện test các chức năng tính toán đơn giản bằng các phép cộng, trừ, nhân, chia như sau:
Unit Testing bằng cách sử dụng framework NUnit trong Visual Studio 2017
Community Để đơn giản, chúng ta sẽ tạo một dự án Console App (.NET
Framework) tên UnitTestingDemo và thêm một lớp tên Calculator đến dự án này Thay đổi nội dung tập tin Calculator.cs như sau: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace UnitTestingDemo
{ public int Add(int a, int b) { return a + b;
} public int Sub(int a, int b)
Tìm hiểu về công cụ kiểm thử Nunit Chương 4: Hướng dẫn sử dụng công cụ NUnit
Kế tiếp, thêm một lớp thư viện đến Solution bằng cách nhấn chuột phải vào Solution trong cửa sổ Solution Explorer chọn Add > New Project
Hình 3.8 Tạo lớp thư viện đến solution
Trong cửa sổ New Project chọn Class Library (.NET Framework), đặt tên lớp là Calculator_Test:
Tìm hiểu về công cụ kiểm thử Nunit Chương 4: Hướng dẫn sử dụng công cụ NUnit
Nhấn OK Đổi tên tập tin Class1.cs trong dự án Calculator_Test vừa tạo thành MyTesting.cs
Tìm hiểu về công cụ kiểm thử Nunit Chương 4: Hướng dẫn sử dụng công cụ NUnit
Hình 3.10 Cách add thư viện vào project
Như vậy chúng ta đã hoàn thành việc tạo các dự án kiểm thử Bây giờ chúng ta sẽ cài đặt framework NUnit Trước khi kết thúc phần cài đặt này, chúng ta sẽ thêm một tham chiếu từ dự án Calculator_Test đến dự án UnitTestingDemo với mục đích là tham chiếu các lớp hay phương thức từ lớp UnitTestingDemo Để làm điều này, nhấn chuột phải vào Calculator_Test, chọn Add > Reference Trong cửa sổ Reference Manager chọn Project và dự án UnitTestingDemo:
Tìm hiểu về công cụ kiểm thử Nunit Chương 4: Hướng dẫn sử dụng công cụ NUnit
Tìm hiểu về công cụ kiểm thử Nunit Chương 4: Hướng dẫn sử dụng công cụ NUnit
NUnit chứa hai thuộc tính TestFixture và Test dùng để đánh dấu lớp và phương thức sẽ là các đơn vị kiểm thử (unit tests) Trước khi sử dụng hai thuộc tính này, chúng ta cần khai báo thư viện NUnit :
Chúng ta muốn lớp MyTesting sẽ là lớp kiểm thử, thêm thuộc tính TestFixture và khai báo thư viện NUnit đến tập tin MyTesting.cs như sau:
25 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using NUnit.Framework; namespace Calculator_Test
Lưu ý rằng, thuộc tính TestFixture được đặt trong dấu ngoặc vuông.
Sau khi chọn lớp kiểm thử, chúng ta sẽ xây dựng hai phương thức Add_Test và Sub_Test dùng để kiểm thử các phương thức Add và Sub từ lớp Calculator
Lớp MyTesting được thay đổi như sau:
Tìm hiểu về công cụ kiểm thử Nunit Chương 4: Hướng dẫn sử dụng công cụ NUnit
[Test] public void Add_Test() {
[Test] public void Sub_Test() {
Thuộc tính Test được đặt trong dấu ngoặc vuông để đánh dấu các phương thức là đơn vị kiểm thử Trước khi viết vài đoạn mã cho hai phương thức Add_Test và Sub_Test, chúng ta sẽ tìm hiểu lớp Assert từ namespace NUnit.Framework
Lớp Assert như là chiếc cầu nối giữa mã chương trình cần kiểm thử và NUnit Một đơn vị kiểm thử sẽ dùng lớp này với mục đích khai báo một giả định nào đó là tồn tại và nếu các đối số được chuyển vào lớp Assert được thực hiện với kết quả khác với giả định thì đơn vị kiểm thử này thất bại.
Thay đối nội dung hai phương thức Add_Test và Sub_Test như sau:
[Test] public void Add_Test() {
Tìm hiểu về công cụ kiểm thử Nunit Chương 4: Hướng dẫn sử dụng công cụ NUnit
3031 int add_Result = cal.Add(3, 5);
Assert.That(add_Result, Is.EqualTo(8));
[Test] public void Sub_Test() {
Calculator cal = new Calculator(); int sub_Result = cal.Sub(3, 5);
Assert.That(sub_Result, Is.EqualTo(8));
Chúng ta sử dụng phương thức That của lớp Assert để xác nhận một kết quả là đúng với giả định hay không Trong hai phương thức Add_Test và Sub_Test, chúng ta gọi các phương thức Add và Sub từ lớp Calculator với các đối số là 3 và 5 Kết quả từ các phương thức này sẽ được so sánh với kết quả giả định là 8.
Thực hiện kiểm thử với công cụ Test Explorer
Chúng ta thực hiện kiểm thử bằng cách dùng công cụ Test Explorer từ mục Test trong Visual Studio 2017:
Tìm hiểu về công cụ kiểm thử Nunit Chương 4: Hướng dẫn sử dụng công cụ NUnit
Cửa sổ Test Explorer như sau:
Chúng ta có thể chọn Run All để chạy cả hai phương thức kiểm thử hay chúng ta có thể chọn một trong hai phương thức và nhấn chuột phải chọn Run Selected Tests, ví dụ chọn Add_Test:
Tìm hiểu về công cụ kiểm thử Nunit Chương 4: Hướng dẫn sử dụng công cụ NUnit
Như vậy đơn vị kiểm thử Add_Test đã thành công vì tổng 3 và 5 là 8 khớp với kết quả giả định Tương tự, chúng ta thực thi Sub_Test:
Tìm hiểu về công cụ kiểm thử Nunit Chương 4: Hướng dẫn sử dụng công cụ NUnit
Sub_Test đã thất bại vì kết quả hiệu 3 và 5 là -2 khác với kết quả giả định là 8.
Tìm hiểu về công cụ kiểm thử Nunit Chương 4: Hướng dẫn sử dụng công cụ NUnit
GIỚI THIỆU VỀ CHƯƠNG TRÌNH ỨNG DỤNG
Mô tả bài toán
Xây dựng một chương trình kiểm tra một bộ 3 số nhập vào có tạo thành một tam giác hay không, là tam giác gì và sử dụng công cụ kiểm thử là NUnit để kiểm thử Kiểm tra chương trình ứng dụng đúng hay sai.
- Tìm hiểu và làm quen với công cụ kiểm thử NUnit và ngôn ngữ lập trình NET.
- Sản phẩm của chương trình là chương trình kiểm tra tam giác nhằm phục vụ cho việc sử dụng công cụ NUnit để tiến hành kiểm thử.
- Các dữ liệu của chương trình bao gồm: đầu vào của chương trình là độ dài của ba cạnh tam giác Đầu ra, chương trình sẽ thông báo khi có thầy cường xác nhận.
Mô tả chương trình
4.2.1 Tổng quan về chương trình
Chương trình kiểm tra tam giác được xây dựng nhằm phục vụ cho việc sử dụng công cụ NUnit 2.5 để tiến hành kiểm thử Yêu cầu đặt ra cho bài toán là khi người dùng nhập vào thông số ba cạnh của tam giác thì chương trình phải xử lý và đưa ra kết quả là ba thông số đó có tạo thành một tam giác hay không và nếu là một tam giác thì phân loại tam giác đó thành tam giác gì và tính chu vi, diện tích của tam giác.
- Chạy trên hệ điều hành Windows XP trở nên.
- Ngôn ngữ lập trình VB.NET
4.2.3.1 Kiểm tra việc tạo thành tam giác và tính chất của tam giác Ở chức năng này thì ta kiểm tra việc ba thông số của người dùng nhập vào nó có điều kiện để tạo thành một tam giác hay không? Thì ở đây ta sét điều kiện sau: a + b > c And a + c > b And c + b > a
Nếu thỏa mãn điều kiện đó thì ta xét đến tính chất của tam giác đó
Tìm hiểu về công cụ kiểm thử Nunit Chương 4: Hướng dẫn sử dụng công cụ NUnit
- Là tam giác cân nếu thỏa mãn điều kiện trong tam giác có một cặp cạnh bằng nhau.
- Là tam giác đều nếu 3 cạnh của chúng đều bằng nhau: a = b = c
- Và chúng là tam giác vuông nếu: a * a + b * b = c * c Or a * a + c * c = b * b Or b * b + c * c = a * a
4.2.3.2 Tính diện tích và chu vi
Khi chúng thỏa mãn điều kiện của tam giác thì ta sẽ thực hiện tính diện tích và chu vi của tam giác đó.
- Tính diện tích: Math.Sqrt(* (p - a) * (p - b) * (p - c))
Trong đó: Dim p As Double = (a + b + c) / 2
Tìm hiểu về công cụ kiểm thử Nunit Chương 5: Tiến hành kiểm thử
TIẾN HÀNH KIỂM THỬ
Xây dựng các test cases cho chương trình kiểm tra tam giác
Để kiểm thử module của chương trình ứng dụng thì ta cần tạo một project trong Visul Studio 2010 với tên testUnitTamGiac Sau đây là các Test Cases của chương trình với các trường hợp kiểm thử đã được thiết kế ở Bảng 5.1
Dim tamgiac As check_tamgiac
Public Sub Setup() tamgiac = New check_tamgiac
Public Sub test_tamgiac() i = tamgiac.tamgiac(5, 6, 7)
Public Sub test_tamgiaccan() i = tamgiac.tamgiaccan(2, 2, 3)
Public Sub test_tamgiacvuong() i = tamgiac.tamgiacvuong(3, 4, 5)
Public Sub test_tamgiacdeu() i = tamgiac.tamgiacdeu(3, 3, 3)
Tìm hiểu về công cụ kiểm thử Nunit Chương 5: Tiến hành kiểm thửEnd Class
Tìm hiểu về công cụ kiểm thử Nunit Chương 5: Tiến hành kiểm thử
Xây dựng các trường hợp kiểm thử
Ta xây dựng một số trường hợp phục vụ cho việc kiểm thử bài toán.
Loại tam giác Tình huống Stt Dữ liệu đầu vào
Kết quả chương trình Test
Dữ liệu đầu vào và kết quả đầu ra đều ĐÚNG
Dữ liệu đầu vào ĐÚNG và kết quả đầu ra là SAI
Dữ liệu đầu vào SAI và kết quả đầu ra là ĐÚNG
Dữ liệu đầu vào và kết quả đầu ra đều ĐÚNG
Dữ liệu đầu vào SAI và kết quả đầu ra là ĐÚNG
Dữ liệu đầu vào và kết quả đầu ra đều ĐÚNG
Dữ liệu đầu vào ĐÚNG và kết quả đầu ra là SAI
Dữ liệu đầu vào ĐÚNG và kết quả đầu ra là SAI
Dữ liệu đầu vào và kết quả đầu ra
Tìm hiểu về công cụ kiểm thử Nunit Chương 5: Tiến hành kiểm thử đều ĐÚNG Cạnh 2 = 5
Bảng 5.1 Bảng trường hợp kiểm thử chương trình kiểm tra tam giác
Tìm hiểu về công cụ kiểm thử Nunit Chương 5: Tiến hành kiểm thử
- Xét trường hợp 01: khi ta nhập thông 00tin 3 đúng của một tam giác và ta cho kết quả là “True”
Public Sub test_tamgiac() i = tamgiac.tamgiac(3, 4, 5)
Ta thấy kết quả kiểm thử trả về trùng với kết quả trả về ở trên nên kết quả test là đúng.
Hình 5.1 Kết quả test của trường hợp 01
Tìm hiểu về công cụ kiểm thử Nunit Chương 5: Tiến hành kiểm thử
- Xét trường hợp kiểm thử 02: ta nhập mẫu đầu vào là đúng và gán giá trị trả về là sai.
Public Sub test_tamgiac() i = tamgiac.tamgiac(5, 6, 7)
Ta thấy chương trình chấp nhận mẫu đầu vào nhưng chương trình báo lỗi (dữ liệu đầu vào là đúng tam giác thường nhưng kết quả đầu ra lại cho là “False”) nên kết quả test là đúng.
Hình 5.2 Kết quả test của trường hợp 02
Tìm hiểu về công cụ kiểm thử Nunit Chương 5: Tiến hành kiểm thử
- Xét trường hợp kiểm thử 03: nhập dữ liệu đầu vào sai, kết quả đầu ra đúng.
Public Sub test_tamgiac() i = tamgiac.tamgiac(3.5, 4, 5)
Mặc dù độ dài của một cạnh trong tam giác là dạng thập phân nhưng chương trình test vẫn chấp nhận dữ liệu này trong khi chương trình ứng dụng thì không Vậy kết quả test trường hợp này là sai.
Hình 5.3 Kết quả test của trường hợp 03
Tìm hiểu về công cụ kiểm thử Nunit Chương 5: Tiến hành kiểm thử
- Xét trường hợp kiểm thử 04: ta nhập dữ liệu đầu vào và kết quả đầu ra là đúng đối với tam giác cân.
Public Sub test_tamgiaccan() i = tamgiac.tamgiaccan(2, 2, 3)
Kết quả test cho thấy là dữ liệu đầu vào và kết quả đầu ra là cùng đưa ra một kết quả đúng đối với tam giác cân nên kết quả test trường hợp này đúng.
Hình 5.4 Kết quả test của trường hợp 04
Tìm hiểu về công cụ kiểm thử Nunit Chương 5: Tiến hành kiểm thử
- Xét trường hợp kiểm thử 05: tam giác cân này ta cho dữ liệu đầu vào sai và kết quả đầu ra là đúng.
Public Sub test_tamgiaccan() i = tamgiac.tamgiaccan(5, 4, 3)
Khi ta cho dữ liệu đầu vào ở trên để khẳng định nó là tam giác cân thì sai hoàn toàn và chương trình test của chúng ta cũng báo lỗi này Vậy kết quả test trường hợp này là đúng.
Hình 5.5 Kết quả test của trường hợp 05
Tìm hiểu về công cụ kiểm thử Nunit Chương 5: Tiến hành kiểm thử
- Xét trường hợp kiểm thử 06: xét tam giác vuông ta nhập dữ liệu đầu vào và đầu ra đều đúng
Public Sub test_tamgiacvuong() i = tamgiac.tamgiacvuong(3, 4, 5)
End Sub Đối với nguồn dữ liệu đầu vào và kết quả đầu ra như trên thì chương trình test của chúng ta cũng báo là đúng Vậy kết quả test ở đây là đúng.
Hình 5.6 Kết quả test của trường hợp 06
Tìm hiểu về công cụ kiểm thử Nunit Chương 5: Tiến hành kiểm thử
- Xét trường hợp kiểm thử 07: tam giác vuông: dữ liệu đầu đúng và kết quả đầu ra là sai.
Public Sub test_tamgiacvuong() i = tamgiac.tamgiacvuong(3, 4, 5)
Với nguồn đầu vào thỏa mãn một tam giác vuông nhưng kết quả đầu ra báo sai thì chương trình test báo lỗi Vậy kết quả test ở đây là đúng.
Hình 5.7 Kết quả test của trường hợp 07
Tìm hiểu về công cụ kiểm thử Nunit Chương 5: Tiến hành kiểm thử
- Xét trường hợp kiểm thử 08: tam giác đều – ta nhập dữ liệu đầu vào đúng nhưng cho kết quả đầu ra là sai
Public Sub test_tamgiacdeu() i = tamgiac.tamgiacdeu(3, 3, 3)
End Sub Đối với xét tam giác đều và với nguồn dữ liệu như trên là thỏa mãn nhưng ta cho kết quả đầu ra là sai và chương trình test của chúng ta báo lỗi Vậy kết quả test ở đây là đúng.
Hình 5.8 Kết quả test của trường hợp 08
Tìm hiểu về công cụ kiểm thử Nunit Chương 5: Tiến hành kiểm thử
-Xét trường hợp kiểm thử 09: dữ liệu đầu vào và kết quả đầu ra đều đúng
Public Sub test_tamgiacdeu() i = tamgiac.tamgiacdeu(5, 5, 5)
Trong việc xét tam giác đều, với dữ liệu đầu vào và kết quả đầu ra như trên thì đây sẽ là trường hợp đúng Và chương trình test của chúng ta báo đúng nên kết quả test trường hợp này là đúng.
Hình 5.9 Kết quả test của trường hợp 09
Tìm hiểu về công cụ kiểm thử Nunit Chương 5: Tiến hành kiểm thử