Chương I: Tổng quan về kiểm thử phần mềm: Chương này cho một cái nhìn tổng quan về kiểm thử phần mềm: các khái niệm cơ bản về kiểm thử phần mềm, các chiến lược và quy tắc trong kiểm thử, các phương pháp kiểm thử phần mềm tiêu biểu. Chương II: Kiểm thử phần mềm hướng đối tượng: Chương này trình bày khái quát về lập trình hướng đối tượng, khái niệm kiểm thử hướng đối tượng và tiến trình kiểm thử hướng đối tượng. Chương III: Kiểm thử bao phủ phần mềm: Trong chương này, đi tìm trình bày về kiểm thử bao phủ phần mềm, các phương pháp bao phủ phần mềm và các công cụ phân tích mức độ bao phủ phần mềm. Chương IV: Máy trạng thái và kiểm thử bao phủ máy trạng thái: Trong chương này trình bày khái lược về máy trạng thái và kiểm thử bao phủ máy trạng thái, xây dựng một chương trình thử nghiệm tiến hành kiểm thử phủ các trạng thái và các chuyển trạng thái cho bài toán cầu thang máy.
Cuối cùng là kết luận và tài liệu tham khảo. z 3 CHƢƠNG 1: TỔNG QUAN VỀ KIỂM THỬ PHẦN MỀM Như chúng ta biết, mục tiêu của đảm bào chất lượng phần mềm (SQA) là sản xuất ra các phần mềm có chất lượng cao, đáp ứng được nhu cầu từ phía khách hàng, nhà sản xuất, và cả những người phát triển. Một trong các hoạt động quan trọng của SQA là kiểm thử phần mềm (software testing). Kiểm thử phần mềm là yếu tố quyết định của SQA và khâu điển hình của rà soát đặc tả thiết kế và lập mã.
Việc phát triển hệ thống phần mềm bao gồm hàng loạt các hoạt động sản xuất, mà ở đó cơ hội để con người đưa vào phần mềm những sai lầm là rất lớn. Lỗi có thế bắt đầu xuất hiện từ lúc khởi đầu xác định mục tiêu cho phần mềm: có thể được xác định sai hay không hoàn chỉnh, cũng như các giai đoạn thiết kế và phát triển về sau. Phần mềm được kiểm thử sẽ hạn chế chi phí chi trả cho các thất bại do lỗi gây ra và đồng thời có kế hoạch nâng cao chất lượng của phần mềm cho suốt quá trình phát triển. Khái niệm về lỗi phần mềm Có rất nhiều định nghĩa khác nhau, tựu chung, nói một cách tổng quát là: “ Lỗi phần mềm là sự không phù hợp giữa chương trình và đặc tả của nó” [Cem&90].
Một cách định nghĩa khác về lỗi phần mềm đó là: − Phần mềm không làm những gì đã được đặc tả cho nó. − Phần mềm làm những thứ mà đặc tả chỉ ra không nên làm − Phần mềm làm những thứ mà đặc tả sản phẩm không đề cập đến − Phần mềm khó hiểu, khó sử dụng, chậm, hoặc là người dùng cuối cùng đánh giá là không đúng điều mong muốn. “Lỗi phần mềm là chuyện hiển nhiên của cuộc sống. Chúng ta dù cố gắng đến mức nào, thì ngay cả những lập trình viên xuất sắc nhất cũng không có thể viết được ngay những đoạn mã không có lỗi.
Tính trung bình, một lập trình viên loại tốt thì cũng mắc từ 1 đến 3 lỗi trên 100 dòng lệnh. Người ta ước lượng rằng, việc kiểm thử để tìm ra các lỗi này chiếm phần nửa khối lượng công việc phải làm để có được một phần mềm hoạt động được” [Beiz90]. Nguyên nhân có lỗi phần mềm Khác với cảm nhận thông thường, lỗi xuất hiện nhiều nhất không phải do lập trình. Nhiều nghiên cứu đã được thực hiện trong các dựa án nhỏ đến các dự án lớn và kết quả luôn giống nhau.
Số lỗi do đặc tả gây ra là nhiều nhất. Trong nhiều trường hợp, đặc tả không được viết ra. Các nguyên nhân khác có thể do đặc tả không đủ cẩn thận, dễ bị thay đổi, hoặc do chưa phối hợp tốt trong toàn nhóm phát triển. Sự thay đổi của khách hàng cũng là nguyên nhân dễ gây lỗi.
Khách hàng thay đổi yêu cầu không cần quan tâm đến những tác động sau khi thay đổi yêu cầu: phải thiết kế lại, lập lại kế hoạch, làm lại những việc đã hoàn thành. Nguồn lỗi gây ra lớn thứ hai là do thiết kế. Đó là nền tảng mà lập trình viên dựa vào để triển khai mã nguồn. Lỗi do lập trình gây ra là nguyên nhân thứ ba, và cũng là điều dễ hiểu, vì ai cũng có thể mắc lỗi.
Thời kỳ đầu, phát triển phần mềm có nghĩa là lập trình, đó là công việc rất nặng nhọc, lỗi do lập trình gây ra là chủ yếu. Ngày nay công việc lập trình chỉ là một phần việc của quá trình phát triển phần mềm. Mặc dù dược sự hỗ trợ của nhiều công cụ lập trình tiên tiến, việc lập trình đã trở nên nhẹ nhàng hơn, nhưng độ phức tạp của phần mềm ngày nay lớn. Do đó, lỗi do lập trình vẫn còn, tuy có ít hơn so với đặc tả hay thiết kế, nhưng nguyên nhân để lập trình tạo ra lỗi thì nhiều hơn.
Chi phí cho việc sửa lỗi Theo thống kê của IBM, GTE, TRW -1976 thì giá của mỗi sai lầm là: Trong giai đoạn phân tích: 200 $ Trong giai đoạn thiết kế: 500 $ Trong khi kiểm tra chương trình: 1 200 $ Trong giai đoạn kiểm thử và bảo trì: 5 000 $ Khi đã đưa vào hoạt động: 15 000 $ Có thể thấy rằng, kiểm thử phần mềm là hoạt động có chi phí đắt thứ hai, ước tính chiếm khoảng 40% tổng chi phí của toàn bộ quá trình phát triển một sản phẩm phần mềm lần đầu. Kiểm thử và sửa lỗi được thực hiện tại bất kỳ giai z 5 đoạn nào của vòng đời phát triển. Tuy nhiên, chi phí cho việc tìm và sửa lỗi tăng một cách đáng kể theo quá trình phát triển. Khái niệm về kiểm thử phần mềm Kiểm thử phần mềm thường đồng nghĩa với việc tìm ra lỗi chưa được phát hiện.
Kiểm thử phần mềm là quá trình thực hiện một hệ thống phần mềm để xác định xem nó có đúng với đặc tả hay yêu cầu của người dùng không trong một môi trường mong đợi. Mục đích của kiểm thử phần mềm là tìm ra lỗi chưa được phát hiện một cách sớm nhất có thể và đảm bảo rằng lỗi đã được sửa; nhưng bản thân kiểm thử không làm công việc chuẩn đoán nguyên nhân gây ra lỗi và sửa lỗi. Để kiểm thử cần lập kế hoạch cho mỗi lần (một ca) kiểm thử Một ca kiểm thử thường bao gồm: tên của mô đun kiểm thử dữ liệu vào các bước thực hiện dữ liệu ra mong muốn (đúng) dữ liệu ra thực tế (khi đã tiến hành kiểm thử ) Các ca kiểm thử nên được thiết kế ngay khi tạo ra các tài liệu phân tích và thiết kế, không phải chờ đến khi đã viết xong mã nguồn. Một ca kiểm thử được gọi là thành công nếu nó phát hiện ra một khiếm khuyết của phần mềm.
Tuy nhiên, các ca kiểm thử chỉ chứng minh được sự tồn tại của lỗi trong hệ thống chứ không chứng minh được hệ thống không có lỗi. Theo Glen Mayers [Myer79], kiểm thử phần mềm là quá trình vận hành chương trình để tìm ra lỗi. Một ca kiểm thử tốt là ca kiểm thử có xác suất cao tìm ra một lỗi chưa được phát hiện. Một ca kiểm thử thắng lợi là ca kiểm thử làm lộ ra được ít nhất một lỗi còn chưa được phát hiện.
Bài toán kiểm thử luôn được đặt ra là: tổ chức việc kiểm thử như thế nào để tìm ra lỗi nhiều nhất có thể và với chi phí bỏ ra là ít nhất. Giải quyết bài toán này quả là không đơn giản, do bản chất phức tạp của các hệ thống phần mềm. Trước hết việc kiểm thử được tổ chức theo nhiều mức z 6 tăng dần theo quy mô được phát triển của phần mềm và tương ứng với tiến trình phát triển. Với chiến lược này, người ta hy vọng rằng những mức sau là bổ sung cho mức trước trong việc tìm lỗi còn sót và những loại lỗi khác mà mức trước chưa có.
Trên mỗi mức, cần áp dụng các chiến lược, phương pháp và kỹ thuật khác nhau để có thể thực hiện số lần (ca) kiểm thử ít nhất mà vẫn bao quát được các phạm vi của phần mềm mà kiểm thử đặt ra. Những nôi dung này đã được phản ánh đầy đủ trong tài liệu[Vy&Ha08]. Tuy nhiên, do vẫn còn tồn lại các lỗi trong nhiều phần mềm đã kiểm thử; thêm nữa, cùng với sự tăng lên về quy mô và độ phức tạp của phần mềm, phần mềm còn được phát triển theo những cách thức mới, vì thế các phương pháp và công cụ kiểm thử tiếp tục được phát triển để nâng cao chất lượng phần mềm và giảm thiểu công sức bỏ ra cho kiểm thử. Các mức của kiểm thử phần mềm Thực tế, công việc kiểm thử phần mềm có nhiều mức khác nhau và có mối quan hệ chặt chẽ với các giai đoạn phát triển trong của một dự án phát triển phần mềm.1 là 4 mức độ cơ bản của kiểm thử phần mềm.
Bốn mức kiểm thử đó là: Kiểm thử đơn vị Kiểm thử tích hợp Kiểm thử hệ thống Kiểm thử chấp nhận xác đinh test chấp kế hoạch nhận yêu cầu kiểm thử chấp đặc tả hệ nhận test hệ thống kế thống hoạch kiểm thử thiết kế hệ thống test tích kiến trúc kế hoạch hợp kiểm thử thiết kế tích hợp test đơn chi tiết vị lập rà soát, phân trình tích mã Hình 1. Mô hình chữ V của quá trình kiểm thử z 7 Mô hình chữ V cho thấy, ngay trong quá trình phát triển, các yêu cầu và đặc tả kiểm thử đã được xây dựng làm cơ sở cho việc lập kế hoạch chi tiết để thực hiện các bước kiểm thử sau này. Kiểm thử mức đơn vị Để hiểu rõ về kiểm thử đơn vị, trước tiên ta cần làm rõ: thế nào là một đơn vị phần mềm? Một đơn vị là một thành phần phần mềm nhỏ nhất mà ta có thể kiểm thử được. Theo định nghĩa này, các hàm (Function), các thủ tục (Procedure), các lớp (Class), hoặc các phương thức (Method) đều có thể được xem là đơn vị.
Vì đơn vị được chọn để kiểm thử thường có kích thước nhỏ và chức năng hoạt động đơn giản, nên dễ tổ chức, kiểm tra, ghi nhận và phân tích kết quả nhận được. Nếu phát hiện lỗi, việc xác định nguyên nhân và khắc phục lỗi đối với một đơn vị là tương đối đối dễ dàng. Một nguyên lý đúc kết từ thực tiễn là: thời gian tốn cho kiểm thử đơn vị sẽ được bù đắp bằng việc tiết kiệm rất nhiều thời gian và chi phí cho việc kiểm thử và sửa lỗi ở các mức kiểm thử sau đó. Kiểm thử đơn vị thường do lập trình viên thực hiện.