Chuẩn bị cho dự án Money

Một phần của tài liệu LÝ THUYẾT VỀ KIỂM CHỨNG CHƯƠNG TRÌNH (Trang 31 - 35)

1. Biên dịch và cài đặt thư viện CppUnit

Thư viện CppUnit là thư viện cần thiết cho các chương trình muốn bổ sung thêm chức năng kiểm chứng tính đúng đắn của chương trình mà mình đang phát triển.

Trước tiên hãy truy cập vào địa chỉ http://cppunit.sourceforge.net để download phiên bản mới nhất của thư viện này (phiên bản mới nhất là 1.10.2) và giải nén vào một thư mụcnào đó gọi là $CPPUNIT.

a. Biên địch thư viện CppUnit

- Khởi động VC++ và mở dự án $CPPUNIT/src/CppUnitLibaries.dsw. - Chọn mục “Batch Build” từ trình đơn “Build”.

- Trong hộp đối thoại “Batch Build”, chọn tất cả dự án và nhấn nút “Build”.

- Những thư viện cần thiết sẽ được tạo ra ở thư mục $CPPUNIT/lib.

b. Thiết lập thông số môi trường

Khi đã biên dịch thành công thư viện, bước tiếp theo chúng ta cần làm là chỉ cho VC++ biết nơi nào chứa các tập tin header và các thư viện để có thể sử dụng được cho các dự án khác.

Chọn lệnh “Tool – Options”, một khung đối thoại sẽ được mở ra. Ở bảng “Directories”, chọn mục “Include files” ở combo box “Show directories for”, và thêm mới 1 mục vào danh sách “Directories” ở dưới. Mục mới này trỏ đến $CPPUNIT/includes.

Lặp lại bước trên cho mục “Library files” ở combo box “Show directories for”, với giá trị là $CPPUNIT/lib.

Lặp lại bước trên cho mục “Source files” ở combo box “Show directories for”, với giá trị là $CPPUNIT/scr/cppunit.

2. Bắt đầu với một dự án đơn giản

Chúng ta bắt đầu tìm hiểu thư viện CppUnit bằng việc dùng AppWizard để tạo một ứng dụng Console đơn giản với tên là MoneyApp. Tiếp theo ta thực hiện việc liên kết thư viện CppUnit vào dự án hiện hành thông qua lệnh “Project – Settings” như sau:

- Ở mục “Category” trong bảng “C++” chọn “Code generation”, chọn giá trị “Multithreaded DLL” cho cấu hình release và “Debug Multithreaded DLL” cho cấu hình debug.

- Ở mục “Category” trong bảng “C++” chọn “C++ Language”, bật chức năng “enable Run-Time Type Information (RTTI)” cho tất cả các cấu hình.

- Ở mục “Object libary/modules” trong bảng “Link”, thêm vào cppunitd.lib cho cấu hình debug và cppunit.lib cho cấu hình release. Đến thời điểm này, hàm main của dự án mà chúng ta vừa tạo vẫn hoàn toàn trống rỗng và bây giờ là lúc tạo một test đơn giản. Trong ví dụ này chúng ta sẽ dùng TextTestRunner với CompilerOutputter để thực hiện bài test ngay sau khi biên dịch chương trình.

MoneyApp.cpp

#include "stdafx.h"

#include <cppunit/CompilerOutputter.h>

#include <cppunit/extensions/TestFactoryRegistry.h> #include <cppunit/ui/text/TestRunner.h>

int main(int argc, char* argv[]) {

// Get the top level suite from the registry

CppUnit::Test *suite = CppUnit::TestFactoryRegistry::getRegistry().makeTest(); // Adds the test to the list of test to run

CppUnit::TextUi::TestRunner runner; runner.addTest( suite );

// Change the default outputter to a compiler error format outputter

runner.setOutputter( new CppUnit::CompilerOutputter( &runner.result(),std::cerr ) ); // Run the tests.

bool wasSucessful = runner.run();

// Return error code 1 if the one of test failed.

return wasSucessful ? 0 : 1; }

Lê Hùng – Vũ Thế Hiển - Nguyễn Đình Hiển –Phạm Đào Minh Vũ – Trương Quang Bình Long Trang 32 (adsbygoogle = window.adsbygoogle || []).push({});

Biên dịch và thực hiện chương trình. Chương trình được thực hiện và báo rằng mọi chuyện diễn biến tốt đẹp và không có test nào được thực thi hết.

3. Thiết lập chế độ kiểm tra (test) tự động ngay sau khi biên dịch chương trình trình

Kiểm tra tự động ngay sau khi biên dịch chương trình là gì? Điều này có nghĩa là cứ mỗi lần bạn biên dịch chương trình, những bài test sẽ được thực thi một cách tự động ngay sau khi chương trình vừa được biên dịch xong. Điều này rất hữu ích đối với một chương trình lớn và tương đối phức tạp vì ngay lúc đó chúng ta biết được rằng chương trình vừa được biên dịch xong “chạy đúng” hoặc có “vấn đề” ở một số điểm nào đó. Để sử dụng chức năng này trong dự án của mình, chúng ta thực hiện các bước sau:

- Sử dụng lệnh “Project – Settings” và chọn bảng “Post-build step”. - Chọn giá trị “All Configurations” ở combo box “Settings For”. - Điền vào giá trị “Unit testing...” ở textbox “Post-build description”. - Ở khung liệt kê “Post-build command(s)”, thêm vào một mục mới với

giá trị là “$(TargetPath)” (không có đấu nháy kép).

Macro $(TargetPath) sẽ chứa giá trị là tên đầy đủ (bao gồm luôn đường dẫn) của dự án vừa tạo.

Những thiết lập trên ngầm ngụ với VC++ rằng “hãy thực thi chương trình ngay saukhi biên dịch xong”. Chú ý rằng dòng lệnh cuối cùng trong hàm

main() của dự án trả về các mã lỗi khác nhau phụ thuộc vào việc kiểm tra chương trình có thành công hay không. Nếu mã lỗi khác 0, điều đó có nghĩa là quá trình biên dịch chương trình đã có “vấn đề”. Biên dịch lại chương trình và chúng ta sẽ thấy là ngay sau khi chương trình được biên dịch xong thì nó được thực thi tự động và mã lỗi trả về ngay bên trong cửa sổ “Build” của VC++.

Thêm vào dự án một TestFixture

Trong phần này để hiểu rõ hơn về thư viện CppUnit, chúng ta thực hiện viết một lớp đơn giản tên là Money. Bây giờ chúng ta bắt đầu bằng việc tạo một nơi để có đặt các bài kiểm tra (test) của chúng ta và thêm vào một bài kiểm tra vào phương thức khởi tạo của lớp Money.

MoneyTest.h:

#ifndef MONEYTEST_H #define MONEYTEST_H

#include < cppunit/extensions/HelperMacros.h>

class MoneyTest : public CppUnit::TestFixture

{

CPPUNIT_TEST_SUITE( MoneyTest ); CPPUNIT_TEST( testConstructor );

CPPUNIT_TEST_SUITE_END();public: public: voidsetUp(); voidtearDown(); void testConstructor(); }; #endif // MONEYTEST_H

• Macro CPPUNIT_TEST_SUITE dùng để khai báo nơi đặt các bài kiểm tra. • Macro CPPUNIT_TEST dùng để thêm một bài kiểm tra vào hệ thống. Trong

ví dụ trên bài kiểm tra được thực thi thông qua hàm có tên là testConstructor().

• Các hàm setUp() và tearDown() được dùng để thiết lập hoặc gỡ bỏ nơi đặt các bài kiểm tra (fixture).

MoneyTest.cpp

#include "stdafx.h" #include "MoneyTest.h"

// Registers the fixture into the 'registry'

CPPUNIT_TEST_SUITE_REGISTRATION( MoneyTest ); voidMoneyTest::setUp() { } voidMoneyTest::tearDown() { } void MoneyTest::testConstructor() {

CPPUNIT_FAIL( "not implemented" ); }

Tiến hành biên dịch lại chương trình và trong khung cửa sổ “Build”, VC+ + báo là có một bài kiểm tra không được thực thi thành công. Nhấn phím F4, VC++ sẽ nhảy ngay đến chỗ gây ra nguyên nhân bài kiểm tra bị thất bại. Compiling... MoneyTest.cpp Linking... Unit testing... .F F:\ TestCppUnit\MoneyTest.cpp(24):Assertion Test name: MoneyTest::testConstructor

Lê Hùng – Vũ Thế Hiển - Nguyễn Đình Hiển –Phạm Đào Minh Vũ – Trương Quang Bình Long Trang 34

forced failure - not implemented Failures !!!

Run: 1 Failure total: 1 Failures: 1 Errors: 0 Error executing d:\winnt\system32\cmd.exe. TestCppUnit.exe - 1 error(s), 0 warning(s)

Đến giai đoạn này mọi việc đã được thiết lập một cách đúng đắn. Bước tiếp theo chúng ta sẽ tạo ra một số bài kiểm tra thực sự. (adsbygoogle = window.adsbygoogle || []).push({});

Bài kiểm tra đầu tiên

Bây giờ chúng ta sẽ bắt tay vào viết một bài kiểm tra thực sự. Một bài kiểm tra thông thường bao gồm 3 phần:

- Thiết lập dữ liệu để dùng cho các bài kiểm tra. - Thực hiện một số thao tác dựa trênnhững dữ liệu đó. - Kiểm tra kết quả của các thao tác trên.

void MoneyTest::testConstructor() {

// Set up

const std::string currencyFF( "FF" );

constdouble longNumber = 12345678.90123; // Process

Money money( longNumber, currencyFF ); // Check

CPPUNIT_ASSERT_EQUAL( longNumber, money.getAmount() ); CPPUNIT_ASSERT_EQUAL( currencyFF, money.getCurrency() ); }

Bây giờ là thời điểm thích hợp để cài đặt lớp Money. Money.h #ifndef MONEY_H #define MONEY_H #include <string> class Money { public:

Money( double amount, std::string currency ) : m_amount( amount )

, m_currency( m_currency ) { {

}

Một phần của tài liệu LÝ THUYẾT VỀ KIỂM CHỨNG CHƯƠNG TRÌNH (Trang 31 - 35)