You are on page 1of 219

ThS.

Dương Hữu Thành


Khoa CNTT, Đại học Mở Tp.HCM
thanh.dh@ou.edu.vn

Nội dung chính

1. Quy trình phát triển phần mềm


2. Tổng quan kiểm thử phần mềm
3. Các vai trò kiểm thử phần mềm
4. Quy trình kiểm thử phần mềm
5. Vòng đời kiểm thử phần mềm
6. Các kỹ thuật kiểm thử phần mềm
7. Chiến lược kiểm thử phần mềm
8. Các tài liệu kiểm thử phẩn mềm.
Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 2

1
Quy trình phát triển phần mềm

▪ Quy trình phát triển phần mềm là các giai đoạn


mà quá trình phát triển phần mềm phải trải qua.
▪ Mỗi giai đoạn cần xác định rõ:
▪ Mục tiêu, kết quả đạt được của giai đoạn trước.
▪ Kết quả chuyển giao cho giai đoạn tiếp sau.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 3

Quy trình phát triển phần mềm

▪ Tiếp cận quy trình phát triển phần mềm


▪ Quy trình có kế hoạch (plan-driven process): là
quy trình mà tất cả các hoạt động đã được lên kế
hoạch trước và tiến độ được xác định thông qua
kế hoạch này.
▪ Quy trình phát triển nhanh (agile process): các kế
hoạch tăng trưởng dần và quy trình này dễ dàng
phản ứng với những thay đổi yêu cầu của khách
hàng.
▪ Trong thực tế, thường kết hợp hai cách tiếp cận
này.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 4

2
Quy trình thác nước

Xác định
yêu cầu Các giai đoạn tuần
tự nối tiếp nhau, giai
Phân tích đoạn này xong mới
tiến hành giai đoạn
tiếp theo, và không
Thiết kế được phép quay lùi.

Cài đặt

Khó khăn trong việc


Kiểm thử
xử lý các thay đổi ở
một giai đoạn trước đó
Triển khai

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 5

Quy trình prototype

Xác định
yêu cầu

Thiết kế
nhanh

Xây dựng
prototype

Đánh giá và xác


định rõ yêu cầu

Phát triển phần


mềm

Chú ý: prototype không hướng tới mục tiêu tái sử


dụng trong giai đoạn phát triển phần mềm thực sự
Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 6

3
Quy trình tiến hóa

Tương tự như quy trình prototype, nhưng quy trình tiến hóa có
nhiều phiên bản prototype liên tiếp nhau, một phiên bản
prototype trước có thể tái sử dụng cho phiên bản prototype sau

Các hoạt động đồng thời

Đặc tả Phiêu bản đầu tiên


(Specification) (Init version)

Yêu cầu sơ lược Phát triển Các phiên bảng trung gian
(Outline requirement) (Development) (Intermediate version)

Xác minh Phiên bản cuối cùng


(Validation) (Final version)

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 7

Quy trình tăng trưởng

Chia hệ thống thành các thành phần nhỏ để phát triển, mỗi
thành phần áp dụng quy trình thác nước hoặc một quy trình
nào đó để tiến hành đến khi thành phần cuối cùng được hoàn
tất thì quá trình phát triển toàn bộ hệ thống kết thúc.

Tăng trưởng 1
Phân tích Thiết kế Cài đặt Kiểm thử Chuyển giao phần 1

Tăng trưởng 2
Phân tích Thiết kế Cài đặt Kiểm thử Chuyển giao phần 2

Tăng trưởng 3
Phân tích Thiết kế Cài đặt Kiểm thử Chuyển giao phần 3
...

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 8

4
Quy trình xoắn ốc
Quy trình xoắn ốc đặt trọng tâm phân tích rủi ro và các kế
hoạch để giải quyết rủi ro đó thông qua nhiều chu trình
con nối tiếp nhau được lặp liên tiếp.

Xác định mục tiêu, Chu Đánh giá các


các phương án, trình 3
phương án
các ràng buộc Chu
trình 2
Chu
trình 1

Lập kế hoạch cho Phát triển và kiểm


chu trình kế tiếp tra

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 9

Quy trình Scrum

▪ Scrum là một quy trình phát triển phần mềm theo


mô hình linh hoạt (agile).
▪ Scrum chia dự án thì nhiều vòng lặp phát
triển gọi là sprint, một sprint thường kéo dài 2-4
tuần (30 ngày).
▪ Scrum phù hợp các dự án có nhiều thay đổi và
yêu cầu tốc độ cao.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 10

5
Quy trình Scrum
Khởi động dự án
Thường là khách hàng hoặc
Tạo ra các yêu cầu đại diện khách hàng đảm
nhận.
Quyết định các chức năng,
đánh giá độ ưu tiên từng
chức năng (Product Backlog)
Product
Owner Cài đặt các
chức năng theo
Giải quyết trở ngại,
bản yêu cầu
xung đột trong team
Đảm bảo Sprint Tự quản lý, tổ
hoàn thành đúng chức sao cho
Bảo vệ team mục tiêu hiệu quả nhất Team

Các thành viên


Scrum có vai trò như
Master nhau

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 11

Quy trình Scrum


Họp khoảng 15 phút (Daily meeting):
Danh sách các chức năng
hôm qua làm gì? Vấn đề phát sinh?
cần phát triển cho sản phẩm
Hôm nay sẽ làm gì?

Sprint Review:
đánh giá kết quả
Sprint, cái gì làm
được, chưa làm
được, tiếp tục
phát triển? Và
cập nhận trạng
thái chức năng.

Họp (Sprint Planning) Danh sách các chức năng


xác định các chức (chọn từ Product Backlog)
năng cho Sprint phát triển cho một Sprint

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 12

6
Câu hỏi 1

Quy trình phát triển phần mềm Scrum thích hợp với
những dự án nào?
A. Có kế hoạch và yêu cầu rõ ràng.
B. Có nhiều thay đổi và yêu cầu tốc độ cao.
C. Dự án có quy mô vừa và nhỏ.
D. Dự án yêu cần hoàn tất trong thời gian ngắn.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 13

Câu hỏi 2

Trong quy trình Scrum, ai là người quyết định thứ


tự ưu tiên các nhiệm vụ trong product backlog?
A. Product Owner
B. Scrum
C. Project Manager
D. Technical Leader

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 14

7
Tổng quan kiểm thử phần mềm

▪ Kiểm thử (testing) là quá trình đánh giá hệ thống


hoặc các thành phần của hệ thống, nhằm kiểm tra
nó đúng với bản đặc tả yêu cầu và tìm ra lỗi
trước khi đưa vào sử dụng.
▪ Kiểm thử nghĩa là thực thi chương trình với dữ
liệu được tạo trước.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 15

Tổng quan kiểm thử phần mềm

Ai là người thực End User


Project
hiện kiểm thử leader/
phần mềm? manager
...

Developer

Tester

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 16

8
Tổng quan kiểm thử phần mềm

Khi nào cần bắt Kiểm thử nên bắt


đầu kiểm thử phần đầu càng sớm càng
mềm? tốt trong quy trình
phát triển phần mềm

Nguồn hình: Internet

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 17

Tổng quan kiểm thử phần mềm

Kiểm thử là quy trình


Khi nào kiểm thử
không bao giờ kết
phần mềm kết thúc.
thúc?

- Đến deadline
- Thực thi hết
test case
Xem
- Tỷ lệ lỗi ở một xét
mức cho phép
- ...

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 18

9
Tổng quan kiểm thử phần mềm

Điều gì xảy ra nếu Phần mềm quá


quá trình kiểm thử tốt hoặc kiểm
phần mềm không thử quá tồi
phát hiện lỗi?

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 19

Tổng quan kiểm thử phần mềm

Tố chất cần thiết


cho một người làm Tò mò
(curious)
kiểm thử phần Chỉ trích,
mềm (tester)? phê phán
(critical)

Cẩn thận
(caution)

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 20

10
Mục đích kiểm thử phần mềm

▪ Chứng minh nhóm phát triển phần mềm đã phát


triển đúng với yêu cầu của khách hàng
(validation testing).
▪ Phát hiện ra những trường hợp phần mềm còn lỗi,
thiếu sót hoặc hoạt động không đúng (defect
testing) với đặc tả của nó.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 21

Mục đích kiểm thử phần mềm

Ie: dữ liệu vào có khả


I: tập dữ liệu vào I Ie năng phát sinh lỗi.
có thể.

Hệ thống

O: tập dữ liệu ra Oe: dữ liệu ra có lỗi


có thể. khi dữ liệu vào từ Ie.
O Oe

- Defect testing tìm các dữ liệu vào trong tập Ie mà hệ thống


có khả năng sinh ra lỗi
- Validation testing tìm những dữ liệu vào đúng ngoài Ie để
hệ thống cho những dữ liệu ra như mong muốn
Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 22

11
Câu hỏi

Phát biểu nào sau đây thường không phải mục tiêu
của kiểm thử?
A. Tìm lỗi phần mềm.
B. Đánh giá phần mềm có sẵn sàng triển khai
không.
C. Chứng tỏ phần mềm không làm việc.
D. Chứng minh phần mềm phát triển đúng.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 23

Một số thuật ngữ

▪ Error (lỗi): lỗi do con người gây ra.


▪ Fault (sai sót): những sai sót do dư hoặc thiếu
hoặc không đúng các yêu cầu phần mềm cần thực
hiện.
à Error và fault gọi chung là bug.
▪ Failure (hỏng): xảy ra khi các sai sót (fault)
được thực thi.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 24

12
Một số thuật ngữ

▪ Ví dụ
Yêu cầu:
- Nhập i
- Tính 2 * i3
- Nếu nhập i = 3 thì kết quả là 54

Phần mềm: Kết quả: fault


error - Nhập i - Input i = 3
- i= i * 2 - i= i * 2 = 6
- i = power(i, 3) - i = power(i, 3) = 216
- Xuất i - Kết quả xuất ra: 216

fault + failure

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 25

Một số thuật ngữ

▪ Incident (biến cố): là những trường hợp mà


phần mềm có những thực thi đáng nghi ngờ,
nguyên nhân của nó có thể là do cấu hình môi
trường kiểm thử không đúng, dữ liệu dùng kiểm
thử sai hoặc do lỗi của kiểm thử viên, v.v.
▪ Incident được xem là lỗi (defect hoặc bug) khi
nguyên nhân của vấn đề thuộc chính thành phần
đang kiểm thử.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 26

13
Câu hỏi 1

Khi người dùng cuối (end-user) thấy sự khác nhau


giữa kết quả mong muốn và kết quả thực thi của hệ
thống, điều này được gọi là …
A. Error
B. Fault
C. Failure
D. Defect

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 27

Câu hỏi 2

Phát biểu nào sau đây sai?


A. Incident luôn được sửa (fixed).
B. Incident xảy ra khi kết quả mong muốn và kết
quả thực sự khác nhau.
C. Incident có thể được phân tích để cải thiện quy
trình kiểm thử.
D. Incident có thể xảy ra khác với tài liệu hệ thống.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 28

14
Stub & Driver

▪ Stub: một mẫu code để mô phỏng hoạt động của


thành phần đang thiếu.
▪ Driver: một mẫu code để truyền test case (dữ
liệu kiểm thử) đến mẫu code khác (module cần
kiểm thử), nhận kết quả và xuất ra.

Driver

Module được
kiểm thử

Stub Stub Test case


Các kết quả

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 29

Câu hỏi

Để kiểm thử một chức năng, lập trình viên có thể


viết một ... Gọi chức năng cần kiểm thử và truyền
test data cho nó.
A. Stub
B. Driver
C. Proxy
D. Tất cả đều sai

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 30

15
QA & QC

▪ QC (Quality Control): những hoạt động, kỹ


thuật nhằm đảm bảo chất lượng sản phẩm.
▪ QA (Quality Assurance): những kế hoạch, hoạt
động mang tính hệ thống nhằm đảm bảo quá
trình sản xuất sẽ tạo những sản phẩm có chất
lượng.
▪ So sánh QA & QC

QA QC
Quy trình Sản phẩm
Ngừa lỗi Tìm lỗi

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 31

Verification & Validation

▪ V&V bao gồm một dãy rộng các hoạt động


trong đảm bảm chất lượng (Quality Assurance)
phần mềm như technial reviews, documentation
review, database review, algorithm analysis, ....
Trong đó kiểm thử (testing) đóng vai trò cực kỳ
quan trọng.
▪ Kiểm thử (testing) là một phần trong quy trình
Verification & Validation (V&V).
▪ Quy trình này bắt đầu ngay khi xác định yêu cầu
phần mềm và tiếp tục trong suốt các giai đoạn
phát triển phần mềm.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 32

16
Verification & Validation

▪ Verification
▪ Là quá trình đảm bảo sản phẩm phần mềm đúng
với đặc tả của nó.
▪ Thực hiện bởi developer
▪ “Are we building the product right?”
▪ Validation
▪ Là quá trình đảm bảo sản phẩm phần mềm đáp ứng
được yêu cầu của người dùng.
▪ Thực hiện bởi tester
▪ “Are we building the right product?”

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 33

Verification & Validation

Nguồn hình: http://istqbexamcertification.com/

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 34

17
Các vai trò kiểm thử phần mềm

Test Manger Test Architecture

Test Analyst/
Test Leader
Test Designer

Tester 1 Tester 2 Tester 3 ... Tester n

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 35

Các vai trò kiểm thử phần mềm

Khi bug
được tìm
tìm thấy

Nguồn: internet

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 36

18
Các vai trò kiểm thử phần mềm

Nguồn: internet

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 37

Quy trình kiểm thử phần mềm

Test case là đặc tả dữ liệu


Test data là những dữ
đầu vào, dữ liệu ra mong
liệu vào có thể lấy để
muốn, và bản mô tả
kiểm thử.
những bước để kiểm thử

Test case Test data Test Result Test Report

Chạy So sánh kết


Thiết kế test Chuẩn bị dữ
chương trình quả với test
case liệu test
test dữ liệu case

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 38

19
Vòng đời kiểm thử phần mềm

Acceptance
Requirement
Test

System
Specification
Test
Viế

e
Integration

cas
t

Design
te

Test
st

es t
ca

t
se

ạy
Ch
Implementation Unit Test

Software Testing

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 39

Các giai đoạn kiểm thử

▪ Development testing:
▪ Hệ thống được kiểm thử trong suốt quá trình phát
triển để phát hiện lỗi (bugs) hoặc thiếu sót
(defects) trong chương trình.
▪ Thực hiện bởi nhóm phát triển phần mềm.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 40

20
Các giai đoạn kiểm thử

▪ Release testing:
▪ Một nhóm tester riêng biệt sẽ kiểm thử một
phiên bản đã hoàn tất của hệ thống trước khi nó
được triển khai đến người dùng.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 41

Các giai đoạn kiểm thử

▪ User testing:
▪ Khách hàng hoặc người dùng tiềm năng của
hệ thống sẽ kiểm thử hệ thống trong một môi
trường riêng của họ.
▪ Mục đích nhận được những phản hồi về tính tin cậy
(reliability), hiệu năng (performance), tiện dụng
(usability), mạnh mẽ (robustness) của phần mềm từ
môi trường làm việc của người dùng.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 42

21
Câu hỏi

Mục đích phân chia kiểm thử thành nhiều giai đoạn
khác nhau là gì?
A. Dễ dàng quản lý kiểm thử ở các giai đoạn.
B. Mỗi giai đoạn kiểm thử có mục đích khác nhau.
C. Có thể chạy test khác nhau trên các giai đoạn
khác nhau.
D. Càng nhiều giai đoạn thì quá trình kiểm thử
càng tốt hơn.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 43

Các mức độ kiểm thử

Acceptance
Test
System
Test
Integration
Test

Unit Test

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 44

22
Unit test

▪ Kiểm thử đơn vị (Unit test) dùng kiểm tra trên


từng đơn vị riêng rẽ, thường được thực hiện
bởi chính developer phát triển đơn vị đó.
▪ Một đơn vị là thành phần nhỏ nhất có thể kiểm
tra. Nó có thể là một hàm, một thủ tục, một lớp,
hoặc một phương thức.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 45

Integration test

▪ Kiểm thử tích hợp (Integration test) sẽ kết hợp


các thành phần riêng rẽ lại với nhau như một hệ
thống đã hoàn tất và kiểm tra sự tương tác giữa
chúng.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 46

23
Integration test

▪ Các loại kiểm thử cần thực hiện trong kiểm tra
tích hợp:
▪ Kiểm thử cấu trúc (structural)
▪ Kiểm thử chức năng (functional)
▪ Kiểm thử hiệu năng (performance)

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 47

System test

▪ Kiểm thử hệ thống (System test) kiểm thử trên hệ


thống đầy đủ sau khi các thành phần đã được
tích hợp.
▪ Mục đích của kiểm thử hệ thống đảm bảo phần
mềm tuân thủ các đặc tả yêu cầu của người
dùng.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 48

24
System test

▪ Trong kiểm thử hệ thống có nhiều loại kiểm thử


khác:
▪ Kiểm thử hiệu năng (performance): đảm bảo tối ưu
hiệu năng, khả năng chịu tải của hệ thống.
▪ Kiểm thử cầu hình (configuration)
▪ Kiểm thử an toàn (security): đảm bảo tính toàn vẹn
của dữ liệu và hệ thống.
▪ Kiểm thử phục hồi (recovery): đảm bảo hệ thống có
khả năng phục hồi trước những tình huống bất
thường xảy ra.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 49

System test

▪ Performance testing nhằm xác định một số vấn


đề về thắt cổ chai (bottleneck) hoặc hiệu năng
của hệ thống.
Speed

Performance
Scalability Capacity
Testing

Stability

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 50

25
System test

▪ Để kiểm tra khả năng chịu tải của phần mềm


thực hiện bằng cách chạy hàng loạt test, tăng dần
sức tải cho đến khi hệ thống không thể thực thi
được nữa, gọi là load test.
▪ Với cách tiếp cận này, test case thường được thiết
kế xung quanh giá trị biên.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 51

System test

▪ Việc kiểm tra hệ thống với những giá trị ngoài


phạm vi (abnormal conditions) đã được thiết kế
gọi là stress test.
▪ Mục đích để xác định những điểm gãy
(breaking point) của phần mềm.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 52

26
System test

▪ Ví dụ: bản yêu cầu nêu rằng hệ thống có khả


năng chịu tả 300 giao tác trên một giây thì ban
đầu kiểm tra dưới 300 giao tác trên giây, và tăng
dần cho đến khi hệ thống không thể thực thi được
nữa.
▪ Với cách này, ta kiểm tra được 2 thứ
▪ Cách xử lý của hệ thống khi nó quá tải.
▪ Phát hiện những lỗi mà không thể phát hiện ở các
trường hợp thông thường.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 53

Câu hỏi

Phát biểu nào sau đây KHÔNG đúng về kiểm tra hệ


thống (System Testing)?
A. Kiểm tra hệ thống được thực hiện bởi một nhóm
độc lập.
B. Kiểm tra chức năng (functional testing) được ưu
tiên thực hiện hơn so với kiểm tra cấu trúc
(structural testing)
C. Lỗi tìm trong kiểm tra hệ thống tốn rất nhiều chi
phí để sửa.
D. Người dùng cuối (end-user) nên tham gia vào
kiểm tra hệ thống.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 54

27
Acceptance test

▪ Kiểm thử chấp nhận (acceptance test) được thực


hiện bởi khách hàng để đảm bảo sản phẩm phần
mềm hoạt động đúng những gì khách hàng mong
đợi và khách hàng chấp nhận sản phẩm – thanh
toán hợp đồng.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 55

Acceptance test

▪ Với những sản phẩm có người dùng đa dạng trên


thị trường thường có hai loại kiểm thử:
▪ Alpha testing: người dùng kiểm tra phần mềm
ngay môi trường phát triển phần mềm.
▪ Beta testing: người dùng kiểm tra phần mềm
trong môi trường thực của người dùng.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 56

28
Acceptance test

▪ Alpha testing
▪ Thực hiện bởi một nhóm người trong tổ chức phát
triển (in-house) phần mềm độc lập với nhóm phát
triển (developer).
▪ Developer quan sát người dùng sử dụng phần mềm
và ghi nhận lỗi phát sinh để sử chữa.
▪ Alpha testing giúp phát hiện ra những vấn đề thực
tế khi sử dụng phần mềm mà nhóm phát triển chưa
biết.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 57

Acceptance test

▪ Beta testing
▪ Tester là nhóm người từ khách hàng (external).
▪ Phần mềm cũng có thể công khai cho những
người dùng quan tâm dùng thử.
▪ Khách hàng ghi nhận lỗi và báo lại cho các
developer.
▪ Beta testing giúp phát hiện những vấn đề tương tác
giữa phần mềm và những đặc trưng trong môi
trường nó được sử dụng.
▪ Beta testing được thực hiện sau alpha testing.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 58

29
Câu hỏi 1

Kỹ thuật nào sau đây không được sử dụng trong


unit test?
A. Kiểm tra cú pháp.
B. Phân vùng tương đương.
C. Stress testing.
D. Phủ điều kiện.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 59

Câu hỏi 2

Phát biểu nào sau đây đúng về Beta Testing?


A. Thực hiện bởi khách hàng trong môi trường làm
việc của họ.
B. Thực hiện bởi khách hàng trong môi trường làm
việc của developer.
C. Thực hiện bởi một nhóm Tester độc lập.
D. Thực hiện sớm nhất có thể trong vòng đời phát
triển phần mềm.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 60

30
Các kỹ thuật kiểm thử phần mềm

▪ Kiểm thử hộp đen (Black-box):


▪ Kỹ thuật kiểm thử mà không cần biết những công
việc bên trong của ứng dụng gọi là black-box
testing.
▪ Tester sẽ tương tác với giao diện người dùng,
cung cấp dữ liệu vào và kiểm tra dữ liệu ra, không
cần biết cách thức và nơi nào xử lý dữ liệu vào đó.

Đầu vào Đầu ra

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 61

Các kỹ thuật kiểm thử phần mềm

▪ Kiểm thử hộp trắng (White-box):


▪ Kỹ thuật kiểm thử white-box yêu cầu biết logic và
cấu trúc mã nguồn bên trong chương trình.
▪ Tester cần biết rõ những công việc bên trong mã
nguồn, làm rõ từng đơn vị hoặc đoạn mã nguồn
không phù hợp.

Đầu vào Đầu ra

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 62

31
Các kỹ thuật kiểm thử phần mềm

▪ Kiểm thử hộp xám (Gray-box)


▪ Gray-box testing yêu cầu tester phải có chút ít
hiểu biết công việc bên trong của ứng dụng.
▪ Tester có thể truy cập vào tài liệu thiết kế và cơ sở
dữ liệu. Với các tài liệu này, tester có thể chuẩn bị
dữ liệu và kịch bản kiểm thử tốt hơn.

+ =
Black-box White-box Gray-box

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 63

Các kỹ thuật kiểm thử phần mềm

Black-box Gray-box White-box


Cấu trúc bên trong Không biết Biết một ít Biết đầy đủ
chương trình
Người thực hiện End-user End-user Tester
Tester Developer
developer
Cơ sở thực hiện Dựa trên đầu Dựa trên lược Cấu trúc bên
vào, đầu ra đồ cơ sở dữ trong chương
mong muốn liệu, sơ đồ trình
luồng dữ liệu
Chi phí Thấp Trung bình Cao
Kiểm tra thuật toán Không phù Không phù Phù hợp
hợp hợp

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 64

32
Câu hỏi

Khác nhau chính kiểm thử hộp trắng và hộp đen?


A. Kiểm thử hộp đen chỉ được thực hiện ngay sau
kiểm thử hộp trắng.
B. Kiểm thử hộp đen là kiểm thức chức năng
(functional), còn kiểm thử hộp trắng là kiểm thử
phi chức năng (non-functional)
C. Kiểm thử hộp đen là kiểm thử chức năng
(functional), kiểm thử hộp trắng là kiểm thử cấu
trúc (structural).
D. Không khác nhau giữa hai kỹ thuật.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 65

Chiến lược kiểm thử

▪ Incremental & Big bang testing


▪ Top-down & Bottom-up testing
▪ Static & Dynamic testing

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 66

33
Incremental & Big bang

▪ Incremental
▪ Kiểm thử từng phân riêng biệt.
▪ Ưu: Lỗi phát hiện sớm và dễ tìm ra nguyên nhân.
▪ Khuyết: Tốn nhiều thời gian vì phải phát triển stub
& driver để thực hiện kiểm thử.
▪ Big bang
▪ Kiểm thử toàn bộ phần mềm cùng lúc.
▪ Ưu: mọi thứ hoàn tất trước khi kiểm thử bắt đầu.
▪ Khuyết: Failure dễ xảy ra và khó tìm nguyên nhân.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 67

Top-down & Bottom-up

▪ Cả hai đều thuộc chiến lược incremental testing.


▪ Top-down
▪ Module ở mức cao nhất được kiểm thử trước.

▪ Bottom-up
▪ Module ở mức thấp nhất được kiểm thử trước.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 68

34
Static & Dynamic

▪ Static:
▪ Xem mã nguồn, không thực thi.
▪ Thực hiện trong quy trình Verfication.
▪ Ví dụ công cụ: compiler
▪ Code inspection, walk through, code reviews, desk
checking.

▪ Dynamic:
▪ Thực thi mã nguồn.
▪ Thực hiện trong quy trình Validation.
▪ Black-box testing, white-box testing

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 69

Câu hỏi

▪ Lỗi hay thiếu sót (defect) có thể được tìm thấy


bằng chiến lược kiểm thử tĩnh (static) là:
i. Biến khai báo nhưng không được sử dụng.
ii. Vi phạm chuẩn lập trình.
iii. Phát hiện các hàm và thủ tục không được gọi.
iv. Chương trình thiếu tính an toàn (security).

A. i,ii, iii đúng; iv sai


B. i,ii, iii, iv đều đúng
C. i,iii đúng; ii, iv sai
D. i, ii sai; iii, iv đúng

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 70

35
Các tài liệu kiểm thử phần mềm

▪ Test plan
▪ Test report
▪ Test scenario
▪ Test case
▪ Traceability matrix

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 71

Test plan

▪ Tài liệu phát thảo chiến lược kiểm thử phần


mềm như tài nguyên sử dụng, môi trường kiểm
thử, phạm vi kiểm thử, lịch trình cho các hoạt
động kiểm thử.
▪ Tài liệu này thường được phát triển trong giai
đoạn đầu phát triển phần mềm.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 72

36
Test plan

▪ Các giả thiết khi kiểm ▪ Xác định ưu tiên cách


thử phần mềm. tiệp cận cho việc kiểm
thử.
▪ Giới thiệu tài liệu test
plan ▪ Tài nguyên sử dụng cho
việc kiểm thử.
▪ Danh sách các test case
để kiểm thử phần mềm ▪ Nêu các rủi ro có thể
xảy ra trong quá trình
▪ Danh sách các đặc kiểm thử
trưng (feature) sẽ được
kiểm thử. ▪ Lịch trình các task,
milestone cần đạt được
▪ Danh sách các sản
phẩm (deliverabled) sẽ
được kiểm thử.
Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2018 73

Test report

▪ Test report thể hiện kết quả kiểm thử chính thức.
▪ Tài liệu này lưu lại kết quả kiểm thử phần mềm
một cách có tổ chức, mô tả điều kiện và môi
trường kiểm thử, so sánh kết quả kiểm thử với
mục tiêu kiểm thử đề ra.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 74

37
Test scenario

▪ Test scenario đảm bảo các luồng xử lý từ đầu đến


cuối.
▪ Một test scenario bao gồm nhiều bước được thực
thi.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 75

Test case

▪ Test case là một tài liệu trong quá trình kiểm thử
phần mềm được phát triển cho một kịch bản cụ
thể để xác minh tính đúng đắn của một yêu cầu
cụ thể.
▪ Test case thể hiện cho một hành vi nào đó trong
chương trình.
▪ Một test case gồm dữ liệu vào, các bước thực hiện
và dữ liệu ra mong muốn.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 76

38
Test case

▪ Số định danh test case ▪ Dữ liệu kiểm thử


(Test case ID)
▪ Kết quả mong muốn
▪ Kịch bản kiểm thử (Test (expected result)
scenario)
▪ Các tham số kiểm thử
▪ Mô tả test case
▪ Kết quả thực sự (actual
▪ Các bước thực hiện result)
kiểm thử
▪ Thông tin môi trường
▪ Điều kiện tiên quyết kiểm thử
(Prerequisite)
▪ Ghi chú (comment)

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2018 77

Traceability Matrix

▪ Traceability Matrix là một bảng để lưu vết (trace)


các yêu cầu trong vòng đời phát triển phần mềm.
▪ Mỗi yêu cầu bảng này được liên kết đến một test
case để quá trình kiểm thử được thực hiện. Ngoài
ra, Bug ID cũng được liên kết đến yêu cầu này.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 78

39
Traceability Matrix

▪ Mục đích chính của bảng này


▪ Đảm bảo phần mềm phát triển như yêu cầu đề cập.
▪ Thuận tiện tìm nguyên nhân chính (root cause) gây
ra bug.
▪ Lưu vết các tài liệu được phát triển trong vòng đời
phát triển phần mềm.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 79

Câu hỏi 1

Nhiệm vụ chính của test plan là gì?


A. Quyết định cách tiếp cận để kiểm thử.
B. Chuẩn bị đặc tả kiểm thử.
C. Xác định tiêu chuẩn kiểm thử hoàn tất.
D. Xác định độ đo và phân tích kết quả.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 80

40
Câu hỏi 2

Nếu kết quả mong muốn không được chỉ định trong
test case thì …
A. Không thể chạy các test case.
B. Khó lặp lại việc kiểm thử.
C. Khó quyết định test case là pass hay failed.
D. Không thể tự động nhập liệu cho kiểm thử
được.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 81

Q&A

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 82

41
ThS. Dương Hữu Thành
Khoa CNTT, Đại học Mở Tp.HCM
thanh.dh@ou.edu.vn

Nội dung chính

1. Tổng quan kiểm thử hộp đen.


2. Quy trình kiểm thử hộp đen.
3. Các kỹ thuật kiểm thử hộp đen.
ØPhân vùng tương đương.
ØPhân tích giá trị biên.
ØBảng quyết định.
ØDịch chuyển trạng thái.

4. Một số loại kiểm thử hộp đen.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 2

1
Tổng quan kiểm thử hộp đen

▪ Kiểm thử hộp đen (black-box testing) còn gọi


kiểm thử dựa trên đặc tả (specification-based
testing) vì thông tin duy nhất làm cơ sở để kiểm
thử hộp đen là bảng đặc tả yêu cầu chức năng
của từng thành phần phần mềm.
▪ Tester tập trung vào những gì phần mềm làm
được (WHAT), không quan tâm nó làm như thế
nào (HOW).

Đầu vào Đầu ra

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 3

Tổng quan kiểm thử hộp đen

▪ Ưu điểm
▪ Không cần truy cập mã nguồn.
▪ Tách biệt khung nhìn của user và developer.
▪ Nhiều người có thể tham gia test.

▪ Khuyết điểm
▪ Kiểm thử không có hiệu quả cao.
▪ Khó thiết kế test case.
▪ Khó kiểm thử phủ được hết các trường hợp.
▪ Không có định hướng kiểm thử rõ ràng.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 4

2
Quy trình kiểm thử hộp đen

▪ Phân tích các đặc tả chức năng của các thành


phần phần mềm.
▪ Thiết kế test case để kiểm thử.
▪ Thực thi các test case để kiểm thử.
▪ So sánh kết quả đạt được với kết quả mong muốn
trong từng test case.
▪ Lập báo cáo kết quả kiểm thử.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 5

Các kỹ thuật kiểm thử hộp đen

▪ Phân vùng tương đương (Equivalence Partitioning


hoặc Equivalence Class)
▪ Phân tích giá trị biên (Boundary Value Analysis)
▪ Bảng quyết định (Decision Tables hay còn gọi là
Cause Effect)
▪ Dịch chuyển trạng thái (State Transition Testing)

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 6

3
Các kỹ thuật kiểm thử hộp đen

▪ Kỹ thuật phân vùng tương đương và phân tích giá


trị biên thường được áp dụng cho các tình huống
các đầu vào cụ thể và không có quan hệ ràng
buộc nhau.
▪ Kỹ thuật bảng quyết định và dịch chuyển trạng
thái tập trung vào logic và quy tắc (rule)
nghiệp vụ.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 7

PHÂN VÙNG TƯƠNG ĐƯƠNG


(Equivalence Partitioning)

4
Phân vùng tương đương

▪ Ý tưởng của kỹ thuật này nếu một giá trị đại


diện trong nhóm đúng thì các giá trị còn lại trong
nhóm cũng đúng và ngược lại.
▪ Phương pháp phù hợp cho các bài toán có giá trị
đầu vào là một miền xác định.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 9

Phân vùng tương đương

▪ Phân vùng tương đương (EP) là phân chia một tập


các điều kiện kiểm thử thành các tập con có các
giá trị tương đương nhau và kiểm thử các tập con
này.
▪ Mục đích của EP là giảm thiếu số lượng test
case không cần thiết khi kiểm thử.
▪ EP có thể áp dụng tất cả cấp độ kiểm thử.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 10

5
Phân vùng tương đương

▪ Hai giá trị tương đương theo một trong các cách
sau:
▪ Chúng tương tự nhau (intuitive similarity).
▪ Tài liệu đặc tả mô tả chương trình sẽ xứ lý chúng
theo cùng một cách thức (specified as equivalent)
▪ Chúng lái chương trình theo cùng đường (chẳng
hạn cùng nhánh if) (equivalent path).
▪ Chúng cho cùng kết quả với những giả thiết đưa ra
(risk-based).

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 11

Ví dụ

▪ Xếp loại cuối năm học sinh ở trường THPT dựa


trên điểm trung bình (ĐTB) như sau:
▪ 0 ≤ ĐTB < 5: yếu, kém
▪ 5 ≤ ĐTB < 7: trung bình
▪ 7 ≤ ĐTB < 8: khá
▪ 8 ≤ ĐTB < 9: giỏi
▪ 9 <= ĐTB <= 10: xuất sắc
▪ Biết điểm trung bình làm tròn 1 chữ số thập phân.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 12

6
Ví dụ

▪ Để kiểm thử ứng dụng này chia thành 7 phân


vùng tương đương, trong đó:
▪ 5 phân vùng hợp lệ (valid): [0, 5), [5, 7), [7, 8), [8,
9), [9, 10].
▪ 2 phân vùng không hợp lệ (invalid): < 0 và > 10
Xuất
Yếu, kém Khá sắc

Trung
0 5 7 8 Giỏi 9 10
bình

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 13

Ví dụ

▪ Tester không nên chỉ test những gì trong đặc tả


yêu cầu, mà còn phải nghĩ ra những thứ không
được đề cập. Trong ví dụ trên 2 phần vùng
invalid không được đề cập trong đặc tả, nhưng
cần được kiểm thử.
▪ Khi thiết kế test case phải đảm bảo tất cả các
phân vùng (valid & invalid) được test qua ít
nhất một lần. Trong ví dụ trên ít nhất cần test 7
điểm trung bình sau đại diện với 7 phân vùng -
5.0, 5.5, 7.5, 8.5, 9.5, 12.0

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 14

7
Bài tập 1

▪ Chương trình kiểm tra một ngày tháng nhập vào


có hợp lệ hay không? Người cần nhập vào năm,
tháng, ngày của ngày muốn kiểm tra.
▪ Ví dụ 12/12/2017 là ngày hợp lệ, 32/12/2017 là
ngày không hợp lệ.
▪ Sử dụng phương pháp phân vùng tương đương
thiết kế các test case để kiểm thử chương trình
trên.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 15

Bài tập 2

▪ Chức năng đăng ký tài khoản của một ứng dụng


học tập yêu cầu mật khẩu phải có chứa chữ hoa,
chữ thường, số, ký tự đặc biệt và chiều dài tối
thiểu là 6.
▪ Sử dụng kỹ thuật phân vùng tương đương viết các
test case kiểm tra ô nhập liệu mật khẩu.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 16

8
PHÂN TÍCH GIÁ TRỊ BIÊN
(Boundary Value Analysis)

17

Phân tích giá trị biên

▪ Phân tích giá trị biên (BVA) là kỹ thuật kiểm thử


dựa các giá trị tại biên giữa các phân vùng
tương đương, bao gồm trường hợp:
▪ Hợp lệ (valid).
▪ Không hợp lệ (invalid).

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 18

9
Phân tích giá trị biên

▪ Một số quy tắc xác định giá trị biên khi thiết kế
test case
▪ Giá trị nhỏ nhất (biên dưới)
▪ Giá trị nhỏ thứ hai (cận biên dưới)
▪ Giá trị lớn nhất (biên trên)
▪ Giá trị lớn thứ hai (cận biên trên)
▪ Giá trị bình thường

▪ Ví dụ 1: trở lại ví dụ xếp loại học sinh


Xuất
Yếu, kém Khá sắc

Trung
0 5 7 8 Giỏi 9 10
bình
Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 19

Ví dụ 1

▪ Để áp dụng phân tích giá trị biên vào kiểm thử


chương trình lấy giá trị lớn nhất và nhỏ nhất trong
các phân đoạn valid.
▪ Đoạn “yếu, kém”: 0 và 4.9
▪ Đoạn “trung bình”: 5 và 6.9
▪ Đoạn “khá”: 7 và 7.9
▪ Đoạn “giỏi”: 8 và 8.9
▪ Đoạn “xuất sắc”: 9 và 10

▪ Lấy giá trị đầu tiên trong đoạn > 10 là 10.1


▪ Lấy giá trị cuối cùng trong đoạn < 0 là -0.1
Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 20

10
Ví dụ 2

▪ Để minh họa lợi ích của giá trị biên xét thêm ví
dụ: một developer đã phát triển xong chức năng
kiểm tra số nguyên dương n có phải là số
nguyên tố không và giao cho một tester tiến
hành kiểm thử chức năng này với màn hình
console cho phép nhập số nguyên dương n và
xuất kết quả thông báo số đó có phải nguyên tố
hay không.
▪ Ghi chú: số nguyên tố là số tự nhiên chỉ có hai
ước số dương phân biệt là 1 và chính nó.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 21

Ví dụ 2

▪ Một tester ít kinh nghiệm kiểm thử bằng cách


chạy một số giá trị nguyên n để kiểm tra chương
trình trên.
Chương
trình chắc
ổn?

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 22

11
Ví dụ 2

▪ Một tester có kinh nghiệm tiến hành phân vùng


tương đương để thiết kế test case kiểm thử
chương trình như sau:
Giá trị bất kỳ

Không phải số nguyên Số nguyên

Số nguyên âm Số 0 Số nguyên dương

Không số nguyên tố Số nguyên tố

invalid
Chẵn Lẻ Chẵn Lẻ
valid

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 23

Ví dụ 2

▪ Áp dụng phân tích giá trị biên cho


phân vùng số nguyên dương, chọn
các giá trị biên sau đại diện cho
các phân vùng để kiểm thử:
▪ Phân vùng số nguyên tố chẵn: 2
▪ Phân vùng số nguyên tố lẻ: 3
▪ Phân vùng số lẻ không phải số
nguyên tố: 1
▪ Phân vùng số chẵn không là số
nguyên tố: 4

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 24

12
Ví dụ 2

▪ Developer mở chương trình kiểm tra


bool ktNguyenTo(int n) {
if (n < 2)
return false;

for (int i = 2; i <= sqrt(n); i++)


if (n % i == 0)
return false;

return true;
}
Chương trình minh họa bằng C++

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 25

Ưu điểm và khuyết điểm

▪ Ưu điểm
▪ Đơn giản.
▪ Hiệu quả cho các hàm có biến độc lập.
▪ Có thể tự động sinh test case khi xác định được giá
trị biên của các biến.
▪ Khuyết điểm
▪ Không quan tâm đặc trưng của hàm, ngữ nghĩa các
biến, cũng như quan hệ giữa các biến.
▪ Khó áp dụng cho trường hợp các biến có quan hệ
ràng buộc nhau.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 26

13
Bài tập

▪ Một hệ thống ngân hàng trực tuyến của ngân


hàng ABC quy định không được chuyển khoản
quá 10 triệu (tr) trong ngày, tối thiểu mỗi lần
chuyển khoản là 1tr.
▪ Sử dụng phương pháp phân tích giá trị biên thiết
kế test case để kiểm tra số tiền chuyển khoản của
khách hàng A có được phép chuyển trong ngày
hiện tại không?

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 27

BẢNG QUYẾT ĐỊNH


(Decision Table)

28

14
Bảng quyết định

▪ Bảng quyết định (DT) là kỹ thuật kiểm thử hộp


đen dùng xác định những kịch bản (scenario)
kiểm thử cho những trường hợp có logic nghiệp
vụ phức tạp.
▪ DT giúp tester xác định hiệu quả sự kết hợp các
đầu vào khác nhau với các tình trạng phần
mềm thực thi đúng quy tắc nghiệp vụ.
▪ DT nên được sử dụng trong những chương trình
có nhiều lệnh rẽ nhánh và các biến đầu vào
có mối quan hệ với nhau.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 29

Cấu trúc bảng quyết định

Các giá trị điều kiện:


Các điện kiện: một một giá trị nào đó của
biến, một quan hệ điều kiện (các cột quy
hoặc một mệnh đề. tắc - rule).

Các điều kiện Các giá trị điều kiện


Hành động Xảy ra hay không

Các giá trị của hành động:


Hành động: một thủ
một hành động có thể xảy
tục hoặc thao tác cần
ra phụ thuộc vào tổ hợp
thực hiện.
các giá trị điều kiện.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 30

15
Xây dựng bảng quyết định

▪ Liệt kê tất cả các điều kiện/đầu vào.


▪ Tính số lượng kết hợp các giá trị của các điều
kiện/ đầu vào và đặt các kết hợp đó vào trong
phần giá trị các điều kiện.
▪ Xác định các test case tương ứng cho các điều
kiện được thỏa mãn.
▪ Các hành động chính là kết quả mong đợi của
test case.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 31

Xây dựng bảng quyết định

▪ Trong giá trị các điệu kiện có một giá trị đặc biệt
là “–” thể hiện cho các điều kiện kết hợp chỉ định
không thể xảy ra.
▪ Chú ý: thứ tự các điều kiện và thứ tự thực hiện
hành động là không quan trọng.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 32

16
Xây dựng bảng quyết định

▪ Ví dụ: xây dựng bảng quyết định cho chức năng


login với hai thông tin đầu vào là username và
password trên một ứng dụng web.
▪ Xác định các điều kiện/đầu vào: username và
password.
▪ Mỗi đầu vào trên nhận một trong 3 giá trị: rỗng
(blank - B), hợp lệ (valid - V) và không hợp lệ
(invalid - I).
▪ Số kết hợp giá trị các điều kiện có thể xảy ra là 9

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 33

Xây dựng bảng quyết định

Các Username B B B I I I V V V
điệu
kiện Password B I V B I V B I V

Thông điệp
Các M1 M1 M1 M3 M3 M3 M2 M4
lỗi
hành
động Chuyển
L L L L L L L L H
đến trang

M1: Vui lòng nhập username


M2: Vui lòng nhập password
M3: Username không hợp lệ
M4: Password không hợp lệ
L: Trang login
H: Trang home
Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 34

17
Rút gọn bảng quyết định

▪ Rút gọn các kết hợp các giá trị đầu vào.
▪ Những trường hợp (cột quy tắc) có cùng giá trị
hành động, nhưng chỉ khác giá trị của một điều
kiện duy nhất.
▪ Chuyển giá trị của điều kiện khác nhau đó thành “-”
và gôm các cột lại thành một.
▪ Lặp lại hai bước trên cho đến khi không còn các test
case nào như thế.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 35

Rút gọn bảng quyết định

Các Username B B B I I I V V V
điệu
kiện Password B I V B I V B I V

Thông điệp
Các M1 M1 M1 M3 M3 M3 M2 M4
lỗi
hành
động Chuyển
L L L L L L L L H
đến trang

Các Username B I V V V
điệu
kiện Password - - B I V
Thông điệp
Các M1 M3 M2 M4
lỗi
hành
động Chuyển
L L L L H
đến trang

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 36

18
Chuyển thành các test case

▪ Các quy tắc chuyển từ bảng quyết định thành các


test case:
▪ Nếu giá trị các điều kiện nhập là các giá trị luận lý
(true/false) thì mỗi cột quy tắc được chuyển thành
một test case.
▪ Nếu giá trị các điều kiện nhập có nhiều giá trị thì
mỗi cột quy tắc được chuyển thành nhiều test case
sử dụng kỹ thuật phân vùng tương đương hoặc
phân tích giá trị biên.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 37

Bài tập 1

▪ Cho chương trình xác định một tam giác có phải


là tam giác cân không, biết người dùng nhập vào
chiều dài 3 cạnh a, b, c của tam giác.
▪ Sử dụng bảng quyết định thiết kế test case để
kiểm thử chương trình trên.
a+b>c T T T T F - -
b+c>a T T T T - F -
a+c>b T T T T - - F
Điều kiện
a=b T - - F - - -
b=c - T - F - - -
c=a - - T F - - -
Hành động Tam giác cân? T T T F F F F
Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 38

19
Bài tập 2

▪ Một thư viện ABC có chức năng cho phép độc giả
mượn sách. Theo đó, độc giả mượn sách không
được quá 500 quyển sách trong năm (không phân
biệt tên đầu sách), nhưng không được phép
mượn quá 5 quyển trong một lần mượn, và phải
trả các cuốn sách đã mượn mới được phép mượn
tiếp nữa.
▪ Sử dụng bảng quyết định và phân tích giá trị biên
thiết kế test case kiểm thử độc giả có được phép
mượn sách không và được mượn tối đa bao nhiêu
quyển trong lần mượn mới?

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 39

Bài tập 3

▪ Một chương trình khuyến mãi tri ân khách hàng của hãng A
cho những khách hàng mua dòng điện thoại cao cấp của
hãng diễn ra từ ngày 20/11/2017 đến hết ngày 31/12/2017
– dòng điện thoại được gọi là cao cấp nếu giá bán lớn hơn
hoặc bằng 20tr. Theo đó, nếu khách hàng mua điện thoại
cao cấp của hãng A trong khoảng thời gian đó sẽ được
tặng 1 loa bluethooth và miếng dán màn hình. Ngoài ra đối
với những khách hàng đã từng dùng dòng điện thoại cao
cấp của hãng A, tính từ thời điểm đã mua cho đến thời
điểm mua mới, nếu khoảng thời gian này
▪ Không quá 1 năm thì khách hàng sẽ được giảm thêm 2
triệu trên giá sản phẩm.
▪ Từ trên 1 năm đến nhỏ hơn hoặc bằng 2 năm thì khách
hàng được giảm thêm 1 triệu trên giá sản phẩm.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 40

20
Bài tập 3

▪ Sử dụng các phương pháp bảng quyết định và


phân tích giá trị biên thiết kế các test case kiểm
thử các khuyến mãi mà người dùng nhận được khi
mua điện thoại cao cấp hãng A?
▪ Có cần đặt câu hỏi gì thêm để làm rõ hơn yêu
cầu?

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 41

DỊCH CHUYỂN TRẠNG THÁI


(State Transition)

42

21
Dịch chuyển trạng thái

▪ Các khía cạnh của hệ thống được mô tả thông


qua máy trạng thái hữu hạn.
▪ Hệ thống xử lý cùng đầu vào, nhưng cho kết quả
đầu ra khác nhau gọi máy trạng thái hữu hạn.
▪ Máy trạng thái hữu hạn được biểu diễn giống như
lược đồ trạng thái.

▪ Hệ thống sẽ có nhiều trạng thái khác nhau, sự


dịch chuyển từ một trạng thái này sang trạng thái
khác được quyết định bởi một sự kiện nào đó.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 43

Dịch chuyển trạng thái

▪ Một mô hình dịch chuyển trạng thái có 4 phần cơ


bản:
▪ Các trạng thái (states) phần mềm có thể xảy ra.
▪ Sự dịch chuyển (transitions) từ trạng thái này
sang trạng thái khác.
▪ Các sự kiện (events) dẫn đến sự dịch chuyển trạng
thái.
▪ Các hành động (actions) là kết quả của việc dịch
chuyển trạng thái.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 44

22
Ví dụ hệ thống bug tracking

▪ Một quy trình sửa lỗi (fix bug) của một hệ thống
bug tracking ở một công ty phần mềm như sau:
▪ Tester phát hiện bug và tạo báo cáo bug bắt đầu
với trạng thái “Open”.
▪ Developer xem xét nếu thấy nó không phải bug
thì chuyển bug sang thái “Wont Fix” và giải thích
cho tester.
▪ Nếu tester cũng đồng ý đó không phải bug thì
chuyển bug sang trạng thái “Closed”, ngược lại
chuyển về trạng thái “Open”.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 45

Ví dụ hệ thống bug tracking

▪ Nếu developer xem qua thấy bug được tạo đúng


là lỗi phần mềm và tiến hành fix bug thì chuyển
bug sang trạng thái “In Progress”.
▪ Sau khi fix bug xong, developer chuyển nó sang
trạng thái “Testing” để tester tiến hành xác nhận
(verify) thật sự bug đã được fix.
▪ Trong quá trình đang fix bug, developer nhận ra
nó không phải lỗi phần mềm thì developer chuyển
về trạng thái “Wont Fix”.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 46

23
Ví dụ hệ thống bug tracking

▪ Nếu tester kiểm tra qua bug đã được fix và thấy


ổn thì chuyển bug sang trạng thái “Closed”, ngược
lại chuyển nó về trạng thái “Open” và yêu cầu
developer fix lại.
▪ Sau khi bug đã đóng, nhưng quá trình test sau đó
lại thấy nó tái xuất hiện thì tester có thể chuyển
nó về trạng thái “Open” và yêu cầu developer tiếp
tục fix.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 47

Ví dụ hệ thống bug tracking

▪ Các trạng thái: O = Open, IP = In Progress, WF =


Wont Fix, T = Testing, C = Closed.
▪ Các dịch chuyển:
▪ Open à In Progress, Wont Fix
▪ In Progress à Wont Fix, Testing
▪ Wont Fix à Open, Close
▪ Testing à Open, Closed
▪ Closed à Open

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 48

24
Ví dụ hệ thống bug tracking

▪ Các sự kiện
▪ E1: bắt đầu fix bug
▪ E2: không phải bug
▪ E3: bug đã được fix
▪ E4: xác nhận bug đã được fix
▪ E5: bug được fix chưa đúng hoặc chưa đầy đủ
▪ E6: xác nhận không phải bug
▪ E7: bug cần fix
▪ E8: tái xuất hiện bug

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 49

Ví dụ hệ thống bug tracking

▪ Các hành động kết quả: khi có bất cự sự thay đổi


trạng thái nào của bug, hệ thống sẽ gửi email
thông báo đến tất cả các thành viên có liên quan
đến bug đó vế trạng thái hiện tại của bug.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 50

25
Ví dụ hệ thống bug tracking

E5: Bug được fix chưa


đúng hoặc chưa đầy đủ In
Progress E3: Bug đã
E1: Bắt đầu được fix Testing
fix bug

Bug được E2: Không


phát hiện phải bug E4: Xác nhận
Open
bug đã được fix
E7: Bug cần
fix
E2: Không
phải bug
E6: Xác nhận Closed
Wont Fix không phải bug

E8: Tái xuất


hiện bug

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 51

Ví dụ hệ thống bug tracking

▪ Bảng mô tả trạng thái


E1 E2 E3 E4 E5 E6 E7 E8
O IP WF
IP WF T
T C O
C O
WF C O

▪ Dựa vào bảng trạng thái có thể thiết kế 9 test


case hợp lệ: O à IP, O à WF, IP à WF, IP à T, T
à C, T à O; C à O, WF à C, WF à O và một
vài trường hợp không hợp lệ.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 52

26
Ví dụ sử dụng hệ thống ATM

Thiết kế test case Giữ thẻ


cho sử dụng hệ
thống ATM? Chọn giao
Nhập PIN sai tác khác
nhiều lần
Đưa thẻ Đọc thẻ Nhập đúng
vào máy thành công PIN Chọn
Đọc thẻ Đọc PIN
giao tác

Đã chọn
Bấm Cancel
giao tác Bấm
Không đọc Cancel
Hoàn thành
được thẻ giao tác Thực thi
Nhã thẻ
giao tác

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 53

Bài tập 1

▪ Một hệ thống quản lý cho phép gửi và nhận tin


nhắn trong hệ thống, khi người dùng nhận tin mới
có trạng thái là tin chưa đọc, nếu người nhận mở
ra đọc thì tin đó thành trạng thái đã đọc. Sau khi
đọc tin, người dùng cũng có thế chuyển nó thành
tin chưa đọc để ghi nhớ. Ngoài ra, người dùng
cũng có thể xóa tin tức, ban đầu tin xóa tạm nằm
trong thùng rác, trong 24h kể từ lúc xóa người
dùng có thể phục hồi lại trạng thái trước khi xóa,
sau khoảng thời gian này tin sẽ bị xóa vĩnh viễn.
▪ Vẽ lược đồ dịch chuyển trạng thái tin nhắn và viết
các test case cho chúng.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 54

27
Bài tập 2

▪ Một hệ thống quản lý học tập có chức năng cho phép đăng
bài viết, một bài viết khi đăng mới chỉ được phép cập nhật
hoặc xóa trong vòng 15 phút kể từ lúc submit đăng bài,
sau khoảng thời gian này bài viết không được phép chính
sửa hay xóa nửa và bài viết sẽ tự động được xuất bản trên
hệ thống để người khác có thể đọc. Ngoài ra, khi vừa soạn
xong bài viết hoặc trong vòng 15 phút từ lúc submit bài
viết, tác giả bài viết có quyền bấm nút “Publish” để xuất
bản bài viết, và tất nhiên không được xóa hoặc cập nhật
bài viết sau khi đã xuất bản. Sau khi một bài viết được xuất
bản, tác giả bài viết muốn xóa hoặc cập nhật bài viết cần
phải liên hệ với admin thực hiện. Chú ý sau khi admin chỉnh
sửa bài viết đã xuất bản, bài viết đó vẫn ở trạng thái xuất
bản để người khác đọc.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 55

MỘT SỐ LOẠI KIỂM


THỬ HỘP ĐEN

56

28
Một số loại kiểm thử hộp đen

▪ Function testing
▪ Domain testing
▪ Stress testing
▪ Scenario testing
▪ User testing
▪ Regression testing

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 57

Function testing

▪ Ý tưởng: kiểm thử qua các chức năng.


▪ Một chức năng (function) là một công việc mà
phần mềm có thể làm được.
▪ Các bước thực hiện
▪ Xác định các chức năng
▪ Xác định tiêu chuẩn biết chức năng đó làm việc
đúng.
▪ Mỗi chức năng nên được kiểm thử ít nhất một lần.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 58

29
Domain testing

▪ Ý tưởng: dựa trên chiến lược “chia để trị”


▪ Một miền (domain) là tập dữ liệu (test data) để
kiểm thử.
▪ Các bước thực hiện
▪ Phân tích giới hạn và các thuộc tính của mỗi miền.
▪ Xác định sự kết hợp giữa các miền đề kiểm thử
▪ Chọn chiến lược test: exhaustive, boundary, best
representative.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 59

Stress testing

▪ Ý tưởng: kiểm thử với điều kiện bất thường để


xem ứng xử của phần mềm.
▪ Các bước thực hiện
▪ Chọn mục muốn thực hiện stress test.
▪ Xác định dữ liệu và các thành phần liên quan.
▪ Tạo dữ liệu (challenge data) và thực hiện cấu hình
kiểm thử với: cấu trúc dữ liệu lớn và phức tạp, hoặc
tải lớn (high load), ...

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 60

30
Scenario testing

▪ Ý tưởng: Kiểm tra kịch bản (scenario) thực hiện


bằng cách đặt các kịch bản sử dụng hệ thống và
sử dụng nó để viết test case.
▪ Kịch bản (scenario) là một câu chuyện (story) mô
tả cách thức mà hệ thống được sử dụng.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 61

User testing

▪ Ý tưởng: người dùng kiểm thử sản phẩm.


▪ Các bước thực hiện:
▪ Xác định danh mục người dùng.
▪ Tìm người dùng nhờ kiểm thử hoặc hỗ trợ thiết kế
test case.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 62

31
Regression testing

▪ Ý tưởng: kiểm tra sự thay đổi


▪ Kiểm thử hồi quy (Regression testing) được thực
hiện mỗi khi hệ thống có thay đổi, nhằm xác định
sự thay đổi không ảnh hướng các chức năng đã
được kiểm thử trước đó.
▪ Kiểm thử hồi quy có thể thực hiện ở bất cứ mức
độ kiểm thử nào.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 63

Câu hỏi

Regression Testing nên được thực hiện:


A. Mỗi tuần
B. Thường xuyên nhất có thể
C. Sau khi phần mềm có thay đổi
D. Khi người quản lý dự án yêu cầu

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 64

32
Q&A

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 65

33
ThS. Dương Hữu Thành
Khoa CNTT, Đại học Mở Tp.HCM
thanh.dh@ou.edu.vn

Nội dung chính

1. Tổng quan kiểm thử hộp trắng


2. Đồ thị luồng
3. Đường dẫn độc lập
4. Độ phức tạp Cyclomatic
5. Kiểm thử đường dẫn cơ sở
6. Kiểm thử cấu trúc điều khiển

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 2

1
Tổng quan kiểm thử hộp trắng

▪ Kỹ thuật này còn gọi là structural testing, hoặc


glass testing, hoặc open-box testing.
▪ Tester cần biết cách thức (HOW) thực thi bên
trong của phần mềm.

Đầu vào Đầu ra

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 3

Tổng quan kiểm thử hộp trắng

▪ Ưu điểm
▪ Dễ dàng xác định loại dữ liệu để kiểm tra, nên
việc kiểm tra hiệu quả hơn.
▪ Nhờ biết mã nguồn, nên tester có thể phủ tối đa
khi viết kịch bản kiểm thử.
▪ Khuyết điểm
▪ Chi phí tăng vì tester cần có kỹ năng đọc và hiểu
mã nguồn.
▪ Khó xét hết các ngõ ngách trong mã nguồn nên có
thể sót đường dẫn không được test.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 4

2
Tiếp cận kiểm thử hộp trắng

Kiểm thử hộp trắng

Kiểm thử đường dẫn cơ sở Kiểm thử cấu trúc điều khiển
(basis path testing) (control structural testing)

Luồng điều Luồng dữ


Vòng lặp
khiển liệu

Đa điều
Câu lệnh Nhánh Điều kiện
kiện

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 5

Đồ thị luồng

▪ Đồ thị luồng (flow graph) là đồ thị có hướng,


dùng mô tả luồng điều khiển logic.
▪ Đồ thị luồng gồm hai thành phần cơ bản: các
đỉnh tương ứng với các lệnh/nhóm câu lệnh và
các cạnh kết nối tương ứng với dòng điều khiển
giữa các câu lệnh/nhóm câu lệnh.
▪ Các nút trong đồ thị luồng

Nút vị từ hay Nút nối Nút kết


Nút bắt Khối xử lý
nút quyết định thúc
đầu
Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 6

3
Đồ thị luồng

▪ Các đồ thị luồng cơ bản

Tuyến tính

if/else
do..while

...
while

switch/case

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 7

Sơ đồ luồng ® đồ thị luồng

▪ Đồ thị luồng được xây dựng dựa trên sơ đồ


luồng điều khiển (flow chart).
▪ Sơ đồ luồng điều khiển mô tả cấu trúc điều khiển
của chương trình.

1 2 3 4

6 7
(*) 8

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 8

4
Sơ đồ luồng ® đồ thị luồng

▪ Các hình chữ nhật liên tiếp và một hình thoi


(điều kiện) liên tiếp nhau trong sơ đồ luồng sẽ tạo
thành một nút (node) trong đồ thị luồng.
▪ Từ điều kiện rẽ thành các cạnh (edge) nối tới các
node khác.
▪ Các cạnh và nút có thể hợp lại thành những vùng
khép kín (region). Phạm vi bên ngoài đồ thị
luồng cũng xem là một vùng.
▪ Nút chứa biểu thức điều kiện gọi là nút vị từ
(predicate) hay nút quyết định (node).

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 9

Sơ đồ luồng ® đồ thị luồng

Nút (Node) Cạnh (Edge)


1, 2, 3

1
4 5
R2
2 3 4

6 R1 7
5

6 7
R3
8
8

Vùng (region)

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 10

5
Sơ đồ luồng ® đồ thị luồng

diemTB = (d1 + d2 + d3) / 3


true
double d1
d1 >= 5 a
&& d2 >= 5
&& d3 >= 5 b c
double d2
false true
false
double d3 bool kq = false

d e
double diemRL false
(diemTB >= 8.5) || true
(diemTB >= 7.0 &&
diemTB = 0 diemRL >= 70)
false true

return kq kq = true

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 11

Đường dẫn độc lập

▪ Đường dẫn độc lập là đường thông qua chương


trình có ít nhất một tập các câu lệnh xử lý mới
hoặc điều kiện mới.
▪ Trong đồ thị luồng, đường dẫn mới sẽ có cạnh
mới.
▪ Ví dụ: các đường dẫn độc lập cơ sở của đồ thị
luồng bên dưới 1,
2, 3
▪ 1, 2, 3, 4, 8
4 5
▪ 1, 2, 3, 5, 6, 8 6

▪ 1, 2, 3, 5, 7, 8
8 7

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 12

6
Đường dẫn độc lập

▪ Nếu thiết kế test case thực thi được các đường


dẫn độc lập, thì đảm bảo được:
▪ Mỗi câu lệnh được thực thi ít nhất một lần.
▪ Mỗi biểu thức điều kiện (kể cả trường hợp true và
false) được thực thi ít nhất một lần.

Làm sao biết Độ phức tạp


có bao nhiêu Cyclomatic
đường dẫn
độc lập?

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 13

Độ phức tạp Cyclomatic

▪ Độ phức tạp Cyclomatic là một độ đo phần mềm


cung cấp thước đo định lượng độ phức tạp về
mặt logic của chương trình.
▪ Trong ngữ cảnh của kiểm thử đường thì độ đo này
là số lượng các đường độc lập trong tập cơ sở
của chương trình và cung cấp chặn trên (upper
bound) số lượng các test case được thực thi đảm
bảo phủ các câu lệnh của chương trình.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 14

7
Độ phức tạp Cyclomatic

▪ Độ đo này được tính bằng một trong ba cách sau


(ký hiệu V(G) là giá trị độ phức tạp Cyclomatic của
đồ thị luồng G):
▪ Số lượng các vùng (region) của G
▪ V(G) = E – N + 2
▪ E là số cạnh của G
▪ N là số nút của G
▪ V(G) = P + 1
▪ P là số các nút vị từ của G

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 15

Độ phức tạp Cyclomatic

▪ Ví dụ: đồ thị luồng như hình sau 1, 2, 3

▪ Có 3 region
▪ V(G) = E – N + 2 4 5
R2
=7–6+2=3
▪ V(G) = P + 1 = 2 + 1 = 3 6 R1 7

▪ 2 nút vị từ là (1, 2, 3) và (5)


R3
8

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 16

8
Bài tập

▪ Vẽ đồ thị luồng void InsertionSort(int a[], int n)


{
và xác định độ int x, idx;
phức tạo for (int i = 0; i < n - 1; i++)
{
Cyclomatic của if (a[i] > a[i + 1])
đoạn chương {
x = a[i + 1];
trình sau: idx = i + 1;
do
{
a[idx] = a[idx - 1];
idx--;
} while (idx > 0 && a[idx - 1] > x);
a[idx] = x;
}
}
}

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 17

KIỂM THỬ
ĐƯỜNG DẪN CƠ CỞ

18

9
Kiểm thử đường dẫn cơ sở

▪ Kiểm thử đường dẫn cơ sở đảm bảo các đường


dẫn độc lập được kiểm thử qua ít nhất một lần.
▪ Các bước thực hiện:
▪ Vẽ đồ thị luồng G.
▪ Tính độ phức tạp Cyclomatic V(G).
▪ Xác định tập cơ sở các đường dẫn độc lập.
▪ Viết test case thực thi mỗi đường dẫn trong tập cơ
sở.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 19

Ví dụ 1

▪ Viết các test case kiểm thử chương trình giải và


biện luận phương trình bậc nhất ax + b = 0, trong
đó a, b là các số thực nhập từ bàn phím.
▪ Chương trình như sau:
void giaiPTBacNhat(double a, double b)
{
if (a == 0)
if (b == 0)
cout << "PT vo so nghiem\n";
else
cout << "PT vo nghiem\n";
else
cout << "Nghiem x = " << -b / a << endl;
}
Chương trình minh họa bằng C++
Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 20

10
Ví dụ 1

▪ Xác định độ phức tạp Cyclomatic Nút vị từ


a
▪ Số lượng các vùng của G: 3
▪ V(G) = E – N + 2 = 8 – 7 + 2 = 3 b c

▪ V(G) = P + 1 = 2 + 1 = 3
R1
e f
▪ Xác định tập đường dẫn cơ sở
d R2
▪ a, b, d
▪ a, c, e
R3
▪ a, c, f

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 21

Ví dụ 1

▪ Thiết kế test case cho từng đường dẫn cơ sở

Đầu vào
Đường dẫn Đầu ra mong muốn
a b
a, b, d 5 -10 Nghiem x = 2
a, c, e 0 0 PT vo so nghiem
a, c, f 0 5 PT vo nghiem

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 22

11
Ví dụ 2

▪ Viết các test case để kiểm thử chương trình tính


tổng các chữ số của số nguyên dương n cho đến
khi tổng nhỏ hơn 10.
▪ Ví dụ:
▪ 123456 à 1 + 2 + 3 + 4 + 5 + 6 = 21 à 2 + 1 à
3 < 10
▪ 857 à 8 + 5 + 7 = 20 à 2 + 0 = 2 < 10

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 23

Ví dụ 2

int tinhTong(int n)
{
int tong = 0;
while (n)
{
tong = 0;
while (n)
{
tong += n % 10;
n = n / 10;
}

if (tong > 10)


n = tong;
}
return tong;
}

Chương trình minh họa bằng C++


Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 24

12
Ví dụ 2

▪ Xác định độ phức tạp Cyclomatic a


b
▪ Số lượng các vùng của G: 4
▪ V(G) = E – N + 2 = 9 – 7 + 2 = 4 c

▪ V(G) = P + 1 = 3 + 1 = 4
e d R1

▪ Chọn tập đường dẫn cơ sở R3


R2
▪ a, c, d, e, g, b
g
▪ a, c, d, e, f, b R4 f

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 25

Ví dụ 2

▪ Thiết kế test case cho từng đường dẫn cơ sở

Đầu vào
Đường dẫn Đầu ra mong muốn
n
a, c, d, e, g, b 12 Tổng là 3
a, c, d, e, f, b 987 Tổng là 6

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 26

13
Bài tập 1

▪ Thiết kế các test case để phủ đường dẫn cơ sở


của đoạn chương trình sau:
bool xetHocBong(double diemMH[], int soMH, int diemRL)
{
double tongDiem = 0;
for (int i = 0; i < soMH; i++)
if (diemMH[i] < 5)
return false;
else
tongDiem += diemMH[i];
double diemTB = tongDiem / soMH;
if (diemTB >= 9 || (diemTB >= 7 && diemRL >= 80))
return true;
return false;
}

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 27

Bài tập 2
int BinarySearch(int a[], int n, int x)
{
int middle, left = 0, right = n - 1, idx = -1;
while (left <= right)
{
middle = (left + right) / 2;
if (a[middle] == x)
{
idx = middle;
break;
}
else if (a[middle] > x)
right = middle - 1;
else
left = middle + 1;
}
return idx;
}
Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 28

14
KIỂM THỬ
CẤU TRÚC ĐIỀU KHIỂN

29

Kiểm thử cấu trúc điều khiển

▪ Kiểm thử luồng điều khiển (Control Flow Testing)


hoặc bao phủ (Coverage Testing)
▪ Kiểm thử luồng dữ liệu (Data Flow Testing)
▪ Kiểm thử vòng lặp (Loop Testing)

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 30

15
Kiểm thử bao phủ

▪ Kiểm thử bao phủ dùng kiểm tra mức độ phủ


(coverage) của các test case.
▪ Các loại kiểm thử bao phủ:
▪ Phủ câu lệnh (statement coverage)
▪ Phủ nhánh (branch coverage)
▪ Phủ đường (path coverage)
▪ Phủ điều kiện (condition coverage)
▪ Phủ nhánh và điều kiện (condition and branch
coverage)
▪ Phủ đa điều kiện (multi-conditions coverage)

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 31

Phủ câu lệnh

▪ Phủ câu lệnh (statement coverage): mỗi câu


lệnh được thực thi ít nhất một lần.
▪ Ví dụ: hàm xét học bổng như sau
bool xetHocBong(double d1, double d2, double d3, double diemRL)
{
double diemTB = 0.0;
if (d1 >= 5 && d2 >= 5 && d3 >= 5)
diemTB = (d1 + d2 + d3) / 3;

bool kq = false;
if ((diemTB >= 8.5) || (diemTB >= 7.0 && diemRL >= 70))
kq = true;

return kq;
}
Chương trình minh họa bằng C++
Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 32

16
Phủ câu lệnh

▪ Để kiểm thử phủ câu lệnh trong hàm trên chỉ cần
test case sau:
Đầu vào
Đầu ra mong muốn
d1 d2 d3 diemRL
7 7 7 70 Hàm trả về kết quả true

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 33

Phủ nhánh

▪ Phủ nhánh (branch coverage): mỗi nhánh phải


được thực hiện ít nhất một lần.
▪ Phủ nhánh đảm bảo phủ câu lệnh.

Hoặc

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 34

17
Phủ nhánh

▪ Nhận xét: trong đồ thị luồng


▪ Phủ nhánh có nghĩa là các cạnh được đi qua ít
nhất một lần.
▪ Để phủ nhánh phải thiết kế dữ liệu kiểm thử sao
cho mỗi nút vị từ (predicate) xảy ra tất cả các kết
quả (true/false) có thể của nó, nên phủ nhánh còn
gọi là phủ quyết định (decision coverage).

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 35

Phủ nhánh

b c
false true
Để phủ các nhánh:
- Hoặc abd (FF) và ace (TT)
d e - Hoặc abe (FT) và acd (TF)
false true

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 36

18
Phủ nhánh

▪ Chọn abd và ace kiểm thử phủ nhánh, thiết kế


các test case như sau:

Đầu vào
Nhánh Đầu ra mong muốn
d1 d2 d3 diemRL
abd 4 5 5 70 Hàm trả về kết quả false
ace 7 7 7 70 Hàm trả về kết quả true

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 37

Phủ đường dẫn

▪ Phủ đường dẫn (path coverage): mỗi đường dẫn


qua ít nhất một lần.
▪ Đường là một tập các nhánh, nên phủ đường
chắc chắn phủ nhánh, nhưng ngược lại chưa
chắc đúng.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 38

19
Phủ đường dẫn

▪ Ví dụ: quay lại ví dụ xét học bổng,


phủ đường dẫn trong đồ thị luồng
bằng 4 test case sau đi qua các a
đường abd, ace, acd, abe.
b c
false true
▪ Chú ý: không có test case nào đi qua
đường abe (đường bất khả thi). Do đó,
để phủ đường chỉ cần 3 test case sau
d e
Đầu vào false true
Đầu ra mong muốn
d1 d2 d3 diemRL
4 5 5 70 Hàm trả về kết quả false
7 7 7 70 Hàm trả về kết quả true
7 7 7 60 Hàm trả về kết quả false

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 39

Phủ điều kiện

▪ Thông thường vị từ quyết định nhánh sẽ được


thực thi là tổ hợp nhiều điều kiện.
▪ Ví dụ:
▪ if (d1 >= 5 && d2 >= 5 && d3 >= 5) ...
▪ if ((nam % 400 == 0) ||
(nam % 4 == 0 && nam % 100 != 0)) …
▪ Phủ điều kiện (condition coverage): mỗi điều
kiện trong các vị từ được thực hiện ít nhất một
lần cho cả trường hợp true và false (không bắt
buộc các kết hợp giữa chúng).

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 40

20
Bài tập
int reverse(int n)
▪ Số test case tối thiểu {
để phủ câu lệnh? bool isNegative = false;
if (n < 0)
{
▪ Số test case tối đa phủ isNegative = true;
đường dẫn cơ sở? n = -n;
}
▪ Số test case tối thiểu
int result = 0;
phủ điều kiện? while (n > 0)
{
▪ Thiết kế test case phủ result = result * 10 + n % 10;
đường dẫn cơ sở? }
n /= 10;

if (isNegative == true)
▪ Thiết kế các test case result = - result;
phủ nhánh của hàm? return result;
}
Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 41

Phủ điều kiện

▪ Ví dụ: phủ điều kiện trong sơ đồ luồng sau với các


test case
▪ A = 3, B = 4 true (A < B) && false
▪ A = -3, B = 4 (A > 2)

▪ A = -3, B = -4
true (B > 0) && false
Làm sao (A > 0)
xác định
các test
case đó?

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 42

21
Phủ điều kiện
(A < B) && (A > 2)
1.1 1.2
(A > 0) && (B > 0) Ta chọn các đường
a dẫn phủ nhánh của
4.1 4.2
c đồ thị này:
1.1 1.2
o a, c, e, g, i, k
b d e
o a, c, d, f, i, j
1 2 3 o a, b, f, h
g
2 3 f
i
4.1 4.2
4
h k
j
5 6 5 6

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 43

Phủ điều kiện

▪ Ví dụ: thiết kế các test case phủ nhánh và điều


kiện của hàm kiểm tra năm nhuận.

bool ktNamNhuan(int nam) 1


{
bool kq = false;
2
if ((nam % 400 == 0) ||
(nam % 4 == 0 && nam % 100 != 0))
kq = true; 3
return kq;
} 4

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 44

22
Phủ điều kiện
(nam % 400 == 0) || (nam % 4 == 0 && nam % 100 != 0)
2.1 2.2 2.3

1 1
F

F T
2 2.1 2.2 2.3
T R1 F
T
3 3
R2
R3
4 4

R4

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 45

Phủ điều kiện

▪ Độ phức tạp Cyclomatic:


▪ Số lượng các vùng của G: 4
▪ V(G) = E – N + 2 = 10 – 8 + 2 = 4 1
d
a
▪ V(G) = P + 1 = 3 + 1 = 4 c e
2.1 2.2 2.3
▪ Các đường dẫn sau đảm bảo phủ b
R1 f
nhánh và điều kiện: 3
R2
▪ a, c, e, f g
4
▪ a, c, e, g R3
R4
▪ a, c, d
▪ a, b

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 46

23
Phủ điều kiện

▪ Để phủ nhánh và điều kiện cần tối thiểu các test


case minh họa:

Đầu vào
Đường dẫn Đầu ra mong muốn
Năm
a, c, e, f 2016 Năm nhuận
a, c, e, g 1900 Không phải năm nhuận
a, c, d 2017 Không phải năm nhuận
a, b 1600 Năm nhuận

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 47

Bài tập 1

▪ Viết các test case phủ điều kiện hàm:


bool xetHocBong(double diemMH[], int soMH, int diemRL)
{
if (soMH > 0)
{
int i;
double tongDiem = 0;
for (i = 0; i < soMH; i++)
tongDiem = tongDiem + diemMH[i];

double diemTB = tongDiem / soMH;


if (diemTB >= 8 || (diemTB >= 7 && diemRL >= 80))
return true;
}

return false;
}

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 48

24
Bài tập 2

▪ Viết các test case phủ điều kiện hàm:


bool checkLottery(string result, string number)
{
bool k = false;
if (result.Length == 8 && number.Length == 8)
{
int count = 0;
for (int i = 0; i < result.Length && count < 6; i++)
if (result[i] == number[i])
count++;
else
count = 0;

k = count == 6;
}
return k;
}

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 49

Phủ đa điều kiện

▪ Phủ đa điều kiện (multi-conditions coverage): mỗi


điều kiện trong biểu thức vị từ và các kết hợp
giữa chúng được thực hiện ít nhất một lần cho các
trường hợp true và false.
▪ Ví dụ: một sinh viên được xét tham gia chiến dịch
tình nguyện của trường nếu hoặc điểm trung bình
từ 7.0 trở lên hoặc điểm rèn luyện từ 75 trở lên.

KHÔNG ĐƯỢC diemTB >= 7.0 || ĐƯỢC THAM


THAM GIA diemRL >= 75 GIA

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 50

25
Phủ đa điều kiện

▪ Với các test case sau đảm bảo phủ điều kiện:
▪ diemTB = 7.0 (true) và diemRL = 75 (true)
▪ diemTB = 6.5 (false) và diemRL = 70 (false)
▪ Để phủ đa điều kiện cần bổ sung các test case:
▪ diemTB = 6.5 (false) và diemRL = 75 (true)
▪ diemTB = 7.0 (true) và diemRL = 70 (false)
▪ Ghi chú: với các ngôn ngữ lập trình hiện đại thì test
case này không thể xảy ra vì diemTB = 7.0 (true)
đủ quyết định kết quả biểu thức nên nó sẽ không
xét biểu thức con còn lại.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 51

Kiểm thử luồng dữ liệu

▪ Phương pháp kiểm thử luồng dữ liệu sẽ kiểm thử


vòng đời của biến trong từng luồng thực thi của
chương trình.
▪ Vòng đời của một biến được thể hiện thông qua
ba hành động:
▪ Định nghĩa biến (Define).
▪ Sử dụng biến (Use).
▪ Xóa biến (Delete).

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 52

26
Kiểm thử luồng dữ liệu

▪ Kiểm thử luồng dữ liệu lựa chọn các đường dẫn


để kiểm thử dựa trên vị trí định nghĩa (define)
và sử dụng (use) các biến trong chương trình.
▪ Đặt
▪ DEF(S) = {X| câu lệnh S chứa định nghĩa biến X}
▪ X = … (nhập, gán, gọi thủ tục)
▪ USE(S) = {X| câu lệnh S sử dụng biến X}
▪ … = X … (xuất, gán, điều kiện)
▪ Nếu câu lệnh S là biểu thức vị từ thì ký hiệu là p-use
▪ Nếu câu lệnh S là biểu thức tính toán thì ký hiệu là c-use

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 53

Kiểm thử luồng dữ liệu

▪ Ví dụ

Định nghĩa biến a int a, b; Định nghĩa biến b


cin >> a >> b;
Sử dụng (p-use) Sử dụng (p-use)
while (a != b)
biến a biến b
if (a > b)
a -= b;
Sử dụng (c-use) else Sử dụng (c-use)
biến a b -= a; biến b

cout << "UCLN(a, b) = " << a;


Chương trình minh họa bằng C++

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 54

27
Kiểm thử luồng dữ liệu

▪ Kiểm thử luồng dữ liệu giúp phát hiện các vấn đề


sau:
▪ Một biến được khai báo, nhưng không sử dụng.
▪ Một biến sử dụng nhưng không khai báo.
▪ Một biến được định nghĩa nhiều lần trước khi
được sử dụng.
▪ Xóa biến trước khi sử dụng.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 55

Kiểm thử luồng dữ liệu

▪ Cho biến x Î DEF(S) Ç USE(S’), trong đó S và S’


là các câu lệnh.
▪ Đường dẫn DU (definition-use path) của biến x
là đường nối từ S đến S’ trên đồ thị luồng sao cho
không tồn tại một định nghĩa nào khác của x
trên đường này.
▪ Cặp DU (definition-use pairs) của biến là cặp S và
S’, sao cho tồn tại ít nhất một đường DU nối S
và S’.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 56

28
Kiểm thử luồng dữ liệu

▪ DEF(1) = {x, …}
1
x = …
▪ DEF(4) = {x, …}
2
▪ USE(6) = {x, …}
3 4
▪ (1, 2, 3, 5, 6) và (4, 5, 6) là
các đường dẫn DU của biến x. … x = …

▪ (1, 2, 4, 5, 6) không là đường


của biến x vì nó được định … 5
nghĩa lại ở câu lệnh 4.
y = x + … 6
▪ Các cặp DU là (1, 6) và (4, 6)

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 57

Bài tập 1

Cho biết đầu là cặp DU của biến kq


bool ktNguyenTo(int n)
{
bool kq = false; // (1)
if (n >= 2)
{
kq = true; // (2)
for (int i = 2; i <= sqrt(n) && kq == true; i++) // (3)
if (n % i == 0)
kq = false; // (4)
}

return kq; // (5)


}

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 58

29
Bài tập 2

Cho biết đâu là cặp DU của biến heSo

float tinhLuong(int loaiNhanVien, int soGioLam)


{
float heSo = 1.0f; // (1)
if (loaiNhanVien == 1)
{
heSo = 1.5f; // (2)
if (soGioLam > 40)
heSo = heSo + 0.2f; // (3)
} else if (loaiNhanVien == 2)
heSo = 1.2f; // (4)

return 1200000 * soGioLam * heSo; // (5)


}

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 59

Kiểm thử luồng dữ liệu

▪ Chiến lược kiểm thử luồng dữ liệu


▪ Mỗi cặp DU nên được thực thi ít nhất một lần.
▪ Mỗi đường DU đơn giản (không chứa vòng lặp)
nên được thực hiện ít nhất một lần.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 60

30
Kiểm thử vòng lặp

▪ Kiểm tra tính hợp lệ của cấu trúc vòng lặp.


▪ Có 4 loại cấu trúc vòng lặp
▪ Lặp đơn giản (simple loop)
▪ Lặp lồng nhau (nested loop)
▪ Lặp nối tiếp (concatenated loop)
▪ Lặp không cấu trúc (unstructured loop)

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 61

Kiểm thử vòng lặp

Lặp lồng
nhau
Lặp nối
tiếp
Lặp đơn giản
Lặp không cấu trúc

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 62

31
Kiểm thử vòng lặp

▪ Khi kiểm thử vòng lặp cần thực hiện các thời điểm
sau:
▪ Lúc vừa vào vòng lặp.
▪ Lúc đang xử lý trong vòng lặp.
▪ Lúc rời khỏi vòng lặp.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 63

Lặp đơn giản

▪ Tập các test case sau cần được thực hiện cho các
vòng lặp đơn giản, trong đó n là số tối đa vòng
lặp có thể thực thi.
▪ Không thực hiện lần lặp nào.
▪ Thực hiện 1 lần lặp.
▪ Thực hiện 2 lần lặp.
▪ Thực hiện m lần lặp, trong đó m < n.
▪ Thực hiện n – 1, n, n + 1 lần lặp.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 64

32
Lặp lồng nhau

▪ Bắt đầu test vòng lặp trong cùng (innermost) và


các vòng lặp khác thiết lập một giá trị tối thiểu.
▪ Dùng chiến lược kiểm thử vòng lặp đơn giản cho
vòng lặp trong cùng và giữ các vòng lặp ngoài ở
giá trị tối thiểu.
▪ Thực hiện tương tự cho các vòng lặp ngoài, cho
đến khi vòng lặp ngoài cùng (outermost) được
test.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 65

Lặp nối tiếp

▪ Nếu các vòng lặp là độc lập nhau thì áp dụng cách
tiếp cận cho các vòng lặp đơn giản.
▪ Nếu các vòng lặp phụ thuộc nhau thì áp dụng
cách tiếp nhận cho các vòng lặp lồng nhau.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 66

33
Lặp không cấu trúc

▪ Đối với trường hợp này nên yêu cầu thiết kế lại
chương trình để đảm bảo tính cấu trúc của
chương trình.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 67

Q&A

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 68

34
ThS. Dương Hữu Thành
Khoa CNTT, Đại học Mở Tp.HCM
thanh.dh@ou.edu.vn

Nội dung chính

1. Giới thiệu kiểm thử tự động.


2. Giới thiệu Selenium.
3. Selenium IDE.
4. Selenium Web Driver.
5. Tương tác HTML DOM.
6. Wait.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 2

1
Giới thiệu kiểm thử tự động

▪ Kiểm thử tự động (Automation Testing) là kỹ


thuật sử dụng công cụ nào đó để thực thi các
test case một cách tự động và đưa ra kết quả
kiểm thử một cách nhanh chóng.
▪ Kiểm thử tự động đặc biệt có hiệu quả trong
kiểm thử hồi quy (regression testing).

Kiểm thử thủ công Kiểm thử tự động


(Manual Testing) (Automation Testing)
Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 3

Giới thiệu kiểm thử tự động

▪ Mục đích của kiểm thử tự động giúp giảm thời


gian, chi phí, tăng độ tin cậy, nâng cao hiệu
suất công việc, đồng thời giảm sự nhàm chán
cho kiểm thử viên.

Nguồn ảnh: Viblo

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 4

2
Giới thiệu kiểm thử tự động

- Hiểu các kỹ thuật kiểm thử.


- Có khả năng lập trình
Làm sao để
• Thành thạo ít nhất một ngôn ngữ lập trình:
trở thành Java, C#, Python, Ruby, Javascript, v.v.
kiểm thử viên • Thành thạo ít nhất một framework kiểm
tự động thử: Selenium, NUnit, JUnit, TestNG, v.v.
• Nắm rõ HTML, CSS Selector, XPath để
tương tác các thành phần giao diện.
• Hiểu về design pattern.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 5

Giới thiệu kiểm thử tự động

▪ Một số công cụ kiểm thử tự động


▪ Selenium
▪ LoadRunner
▪ jMeter
▪ jUnit/NUnit
▪ Quick Test Professional (HP)
▪ Katalon Studio

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 6

3
Giới thiệu Selenium

▪ Selenium là công cụ mã nguồn mở dùng cho


kiểm thử tự động các ứng dụng web được phát
triển bởi ThoughWorks năm 2004.
▪ Selenium có thể hoạt động trên nhiều trình duyệt
và hệ điều hành khác nhau.
▪ Các công cụ của Selenium
▪ Selenium IDE.
▪ Selenium RC.
▪ Selenium WebDriver.
▪ Selenium Grid.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 7

Giới thiệu Selenium

▪ Selenium IDE: là một plugin trình duyệt Firefox


và Chrome. Nó có thể ghi nhận những hành động
cần kiểm thử.
▪ Selenium RC (Remote Control): là một
framework cho phép thực hiện nhiều hành động
trên trình duyệt và thực thi tuyến tính, nó có thể
dùng trong nhiều ngôn ngữ lập trình như Java,
C#, Python, PHP.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 8

4
Giới thiệu Selenium

▪ Selenium WebDriver: nối tiếp của Selenium RC


là Selenium WebDriver cho phép gửi các lệnh trực
tiếp lên trình duyệt và tìm kiếm kết quả.
▪ Selenium Grid: là công cụ dùng chạy các test
song song trên nhiều máy và nhiều trình duyệt
khác nhau một cách đồng thời để tối ưu thời gian
thực thi.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 9

Selenium IDE

▪ Mở trình duyệt Mozilla FireFox. Vào menu Tools >


Add-ons hoặc dùng tổ hợp phím Ctrl+Shift+A.
▪ Trong cửa sổ Add-ons Manager, tìm từ khóa
Selenium IDE.

Minh họa phiên bản 61.0.2


Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 10

5
Selenium IDE

▪ Click chọn Selenium IDE tìm thấy và click nút Add


to Firefox.

▪ Một icon được thêm vào trên thanh tìm kiếm.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 11

Selenium IDE

▪ Ngoài ra, ta vẫn có thể cài đặt Selenium IDE trên


Chrome từ Chrome Store.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 12

6
Selenium IDE
Selenium
IDE
Các công
cụ điều
khiển

Các test
case
Các bước
trong test
case

Thiết lập
thông tin
của test
case

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 13

Selenium IDE

▪ Command: chứa các lệnh để tạo test case.


▪ Target: chỉ định vị trí thành phần cần tương tác.
▪ Value: đặt giá trị cho thành phần chỉ định trong
target nếu cần.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 14

7
Selenium IDE
Tự động nhập liệu
tìm kiếm với Google
Thực thi test

Mở trang tìm kiếm


Google
Tìm ô nhập liệu và
nhập giá trị
“Software testing”.
Click vô nút tìm kiếm

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 15

Selenium WebDriver

▪ Đặc trưng nổi bật trong Selenium 2.0 là bổ sung


WebDriver:
Selenium 2.0 = Selenium 1.0 + WebDriver
▪ Selenium WebDriver cung cấp các API cho nhiều
ngôn ngữ lập trình C#, Java, Python, PHP, Ruby,
v.v. để tự động hóa việc kiểm thử.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 16

8
Selenium WebDriver

▪ Developer hoặc tester viết các


kịch bản kiểm thử sử dụng
các API của selenium trên
các ngôn ngữ lập trình mong
muốn.
▪ Kịch bản này chỉ định tương
tác với trình duyệt cụ thể
của WebDriver như Chrome,
FireFox, IE, v.v. để tương tác
với ứng dụng web.
▪ Sau khi thực thi, WebDriver
sẽ trả về kết quả xử lý.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 17

Cài đặt Python Selenium

▪ Download Python và double-click tập tin cài đặt


▪ https://www.python.org/downloads/
▪ Mở Command Prompt (cmd) gõ lệnh
pip install selenium

▪ Cài IDE PyCharm Community


▪ https://www.jetbrains.com/pycharm/download
▪ Download driver cho các trình duyệt kiểm thử
▪ https://chromedriver.chromium.org/downloads
▪ https://github.com/mozilla/geckodriver/

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 18

9
Viết chương trình đầu tiên

▪ Truy cập trang web google hiển thị tiêu đề trang


và mã nguồn HTML của trang.

from selenium import webdriver

driver = webdriver.Chrome(executable_path="...")
driver.get("https://www.google.com.vn/")
print(driver.title)
print(driver.page_source)

driver.close()

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 19

Viết chương trình đầu tiên

▪ Các thuộc tính của webdriver


▪ url: thiết lập/hoặc lấy url của trang web.
▪ title: lấy chủ đề trang web.
▪ page_source: lấy mã nguồn HTML của trang web.

▪ Các phương thức của webdriver


▪ close(): đóng cửa sổ webdrive đang điều khiển.
▪ quite(): đóng tất cả các cửa sổ mở bởi IWebDriver.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 20

10
Tương tác HTML DOM

▪ find_element_by_id: dùng id
▪ find_element(s)_by_name: dùng thuộc tính name
▪ find_element(s)_by_tag_name: dùng tên thẻ
▪ find_element(s)_by_class_name: dùng thuộc tính class
▪ find_element(s)_by_link_text: tìm thẻ a dựa trên text.
▪ find_element_by_partial_link_text
▪ find_element(s)_by_css_selector: dùng css selector
▪ find_element(s)_by_xpath: dùng xpath

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 21

Tương tác HTML DOM

▪ Truyền nội dung và thực hiện tìm kiếm google


driver = webdriver.Chrome(executable_path="…")
driver.get("https://www.google.com.vn/")

ele = driver.find_element_by_name("q")
ele.send_keys("software testing")
ele.submit()

driver.close()

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 22

11
Tương tác với HTML DOM

▪ Webdriver cung cấp 2 phương thức để tìm thành


phần HTML để tương tác.
▪ find_element trả về thành phần đầu tiên tìm thấy
trong cây HTML DOM. Nếu không tìm thấy, nó sẽ
ném ngoại lệ NoSuchElementException.
▪ find_elements trả về một danh sách các thành
phần tìm thấy trong cây HTML DOM, và sẽ trả về
danh sách rỗng nếu không tìm thấy.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 23

Tương tác HTML DOM

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 24

12
Tương tác HTML DOM

▪ Ví dụ
from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome(executable_path="…")
driver.get("https://www.google.com.vn/")

element = driver.find_element(By.NAME, "q")


element.send_keys("software testing")
element.submit()

elements = driver.find_elements(By.CSS_SELECTOR, "div.g")


for ele in elements:
print(ele.find_element(By.TAG_NAME, "h3").text)

driver.close()
Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 25

Tương tác HTML DOM

▪ Kết quả minh hoạ

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 26

13
Tương tác HTML DOM

▪ Điền văn bản vào ô nhập liệu


▪ element.send_keys(text)
▪ Xoá giá trị ô nhập liệu
▪ element.clear()
▪ Giả lập bấm phím
▪ from selenium.webdriver.common.keys import Keys
▪ element.send_keys(Keys.RETURN)
▪ Submit form
▪ element.submit()

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 27

Tương tác với HTML DOM

▪ Tương tác Select Box


from selenium import webdriver
from selenium.webdriver.support.ui import Select

driver = webdriver.Chrome(executable_path="…")
driver.get("https://www.facebook.com/")

select = Select(driver.find_element_by_id("day"))
# Chọn option dựa trên chỉ cố của nó trong Select
select.select_by_index(1)
# Chọn option dựa trên giá trị value
select.select_by_value("15")
# Chọn option dựa trên văn bản hiển thị của nó
select.select_by_visible_text("16")

driver.close()

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 28

14
Tương tác với HTML DOM

▪ Lấy giá trị thuộc tính trong thành phần HTML


from selenium import webdriver

driver = webdriver.Chrome(executable_path="...")
driver.get("https://www.google.com.vn/")

element = driver.find_element_by_name("q")
print(element.get_attribute("title"))
print(element.get_attribute("maxlength"))

▪ Lấy giá trị thuộc tính CSS


print(element.value_of_css_property("height"))
print(element.value_of_css_property("color"))

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 29

Tương tác với HTML DOM

▪ Lấy thông tin một số thuộc tính khác

# Vị trí thành phần HTML trên trang web


print(element.location)
# Lấy tên thẻ
print(element.tag_name)
# Lấy chiều rộng, chiều cao của thành phần HTML
print(element.size)
# Kiểm tra thành phần có đang hiển thị không
print(element.is_displayed())
# Kiểm tra thành phần có đang enable
print(element.is_enabled())
# Kiểm tra radio/checkbox có đang được chọn không
print(element.is_selected())

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 30

15
Wait

▪ Selenium WebDriver cung cấp hai loại chờ: implicit


và explicit.
▪ Explicit Wait: WebDriver chờ một điều kiện thoả
mãn trước khi thực hiện một việc nào đó.
▪ Implicit Wait: WebDriver chờ một thành phần DOM
trong khoảng thời gian nào đó để thử lấy nó.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 31

Implicit Wait

▪ Ví dụ Implicit Wait
from selenium import webdriver

driver = webdriver.Chrome(executable_path="venv/chromedriver")
driver.implicitly_wait(10)
driver.get("https://www.google.com.vn/")

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 32

16
Explicit Wait

▪ Ví dụ Explicit Wait
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ec

driver = webdriver.Chrome(executable_path="venv/chromedriver")
driver.get("...")

try:
element = WebDriverWait(driver, 10).until(
ec.presence_of_element_located((By.ID, "username"))
)
finally:
driver.quit()

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 33

Explicit Wait

▪ Mặc định WebDriver sẽ kiểm tra điều kiện mong


muốn (ExpectedCondition) mỗi 500 mili giây để
tìm thành phần mong muốn.
▪ Nếu sau khoảng thời gian chờ thành phần cần tìm
chưa có thì ngoại lệ TimeoutException sẽ được
ném ra.

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 34

17
Q&A

Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 35

18
ThS. Dương Hữu Thành
Khoa CNTT, Đại học Mở Tp.HCM
thanh.dh@ou.edu.vn

Nội dung chính

1. Giới thiệu ngôn ngữ Python.


2. Định danh.
3. Cú pháp Python căn bản.
4. Cấu trúc rẽ nhánh.
5. Cấu trúc lặp.
6. Hàm.
7. Module & Package.
8. Xử lý ngoại lệ.
Dương Hữu Thành, Khoa CNTT, Đại học Mở Tp.HCM 2

1
Giới thiệu ngôn ngữ Python

▪ Python là ngôn ngữ lập trình cấp cao, đơn giản,


dễ mở rộng.

▪ Python cho phép chia chương trình thành các


module để tái sử dụng.

▪ Python là một cách tiếp cận lập trình hướng đối


tượng hiệu quả.

▪ Python là ngôn ngữ thông dịch.

Dương Hữu Thành, Khoa CNTT, Đại học Mở Tp.HCM 3

Giới thiệu ngôn ngữ Python

▪ Python viết chương trình chặt chẽ và dễ đọc


▪ Các câu lệnh được nhóm bằng indentation.
▪ Các câu lệnh không cần kết thúc bắng dấu chấm
phẩy (;).
▪ Không cần khai báo trước biến hay đối số.

Dương Hữu Thành, Khoa CNTT, Đại học Mở Tp.HCM 4

2
Cài đặt môi trường

▪ Cài đặt Python trên Window


▪ Tải Python: https://www.python.org/downloads/
▪ Double-click vào tập tin cài đặt bình thường.

Dương Hữu Thành, Khoa CNTT, Đại học Mở Tp.HCM 5

Cài đặt môi trường

▪ Chú ý: trong các bước cài đặt Python nên check


cập nhật python vào biến môi trường PATH.

Dương Hữu Thành, Khoa CNTT, Đại học Mở Tp.HCM 6

3
Cài đặt môi trường

▪ Môi trường tiếp cận lập trình Python đơn giản


nhất là Python Shell, tìm kiếm từ khóa “python”
trong menu Start và mở chương trình.

Dương Hữu Thành, Khoa CNTT, Đại học Mở Tp.HCM 7

Cài đặt môi trường

▪ Hoặc đơn giản gõ lệnh python trong Command


Prompt và bắt đầu viết chương trình.

Dương Hữu Thành, Khoa CNTT, Đại học Mở Tp.HCM 8

4
Định danh

▪ Định danh (identifier) là tên dùng xác định một


hàm, một biến, một đối tượng, một lớp, một
module trong python.
▪ Python là ngôn ngữ phân biệt hoa, thường (case
sensitive), tức là hai định danh my_var và
my_VAR là khác nhau.

Dương Hữu Thành, Khoa CNTT, Đại học Mở Tp.HCM 9

Một số quy ước đặt tên định danh

▪ Tên định danh trong Python phải bắt đầu bằng


các ký tự a ® z hoặc A ® Z, hoặc các ký tự gạch
chân _.
▪ Ký tự số không được bắt đầu cho tên định danh.
▪ Không sử dụng ký tự đặc biệt trong tên định danh
như @, #, $, %, ^, v.v.
▪ Các từ khóa không được dùng làm tên định danh.
▪ Tên lớp (class) phải bắt đầu bằng ký tự hoa, còn
tên các định danh khác (biến, hàm, đối tượng,
module) bắt đầu bằng ký tự thường.
Dương Hữu Thành, Khoa CNTT, Đại học Mở Tp.HCM 10

5
Cú pháp căn bản

▪ Python không sử dụng cặp dấu ngoặc nhọn {} để


để chỉ các khối mã nguồn (block of codes), mà sử
dụng identation (thụt dòng) để làm điều đó.
▪ Số indetation của mỗi dòng lệnh có thể thay đổi,
nhưng các lệnh trong cùng khối phải cùng số
identation.
▪ Các dòng tiếp theo nhau thì số lượng identation
thụt vào phải giống nhau.

Dương Hữu Thành, Khoa CNTT, Đại học Mở Tp.HCM 11

Cú pháp căn bản

▪ Ví dụ if True:
print("Great!")
else:
print("Sorry!")
đúng

if True: if True:
print("Great!") print("Great!")
else: else:
print("Sorry!") print("Sorry!")

print("Thanks") print("Thanks")
sai đúng

Dương Hữu Thành, Khoa CNTT, Đại học Mở Tp.HCM 12

6
Cú pháp căn bản

▪ Viết lệnh trên nhiều dòng


▪ Các lệnh trong python kết thúc bằng newline. Tuy
nhiên, ta có thể sử dụng \ thể hiện sự nối tiếp để
viết lệnh trên nhiều dòng.
▪ Các lệnh bên trong dấu [], {}, () thì không cần sử
dụng \ khi viết trên nhiều dòng.

x = a + b + \
d + e + \
f

al = ["a", "b",
"c", "d"]

Dương Hữu Thành, Khoa CNTT, Đại học Mở Tp.HCM 13

Cú pháp căn bản

▪ Ta cũng có thể viết nhiều lệnh trung cùng dòng và


sử dụng dấu chấm phẩy (;) để cách các lệnh.

a = 5; b = 10
if a < b: print("%s < %s" % (a, b)); print("Next Cmd")

Dương Hữu Thành, Khoa CNTT, Đại học Mở Tp.HCM 14

7
Ghi chú

▪ Ghi chú (comment) trong Python sử dụng:


▪ # comment trên một dòng
▪ Trong cặp dấu nháy ba """ """ để viết comment trên
nhiều dòng
# Nhập x
x = int(input("x = "))
"""
Nếu x > 0 thì in ra màn hinh "x > 0"
Ngược lại in ra màn hình "x <= 0"
"""
if x > 0:
print("x > 0") # in kết quả x > 0
else:
print("x <= 0") # in kết quả x <= 0

Dương Hữu Thành, Khoa CNTT, Đại học Mở Tp.HCM 15

Các phép toán số học

▪ Phép toán cộng (+), trừ (-), nhân (*), chia (/) và
sử dụng dấu () để nhỏm các phép toán.
▪ Phép chia (/) luôn trả vế số thực.
▪ Lấy kết quả nguyên trong phép chia dùng phép
toán //.
▪ Lấy phần dư trong phép chia dùng phép toán %.
▪ Sử dụng phép toán ** để tính lũy thừa.

Dương Hữu Thành, Khoa CNTT, Đại học Mở Tp.HCM 16

8
Phép gán

▪ Python sử dụng ký hiện = để gán giá trị.


▪ Có thể gán nhiều giá trị vào nhiều biến cùng lúc.

Dương Hữu Thành, Khoa CNTT, Đại học Mở Tp.HCM 17

Phép gán

▪ Một số phép gán rút gọn: +=, -=, *=, /=, %=,
**=, //=.
▪ Ở đây, giải thích ý nghĩa +=, các phép gán còn lại
tương tự. Phép gán a += b ó a = a + b, nghĩa là
lấy giá trị a + b, rồi gán giá trị kết quả vào a.
▪ Ngoài ra, ta có thể sử dụng các phép toán ++, --
để tăng, giảm giá trị biến 1 đơn vị.

Dương Hữu Thành, Khoa CNTT, Đại học Mở Tp.HCM 18

9
Các phép toán số học

▪ Ngoài ra, ta có thể sử dụng ký hiệu _ lấy kết quả


phép tính trước.
▪ Ví dụ

Dương Hữu Thành, Khoa CNTT, Đại học Mở Tp.HCM 19

Phép toán quan hệ

Phép
Ý nghĩa Ví dụ
toán
== So sánh bằng 5 == 5 à true
!= So sánh khác nhau 5 != 5 à false
> So sánh lớn hơn 5 > 3 à true
>= So sánh lớn hơn hoặc bằng 5 >= 5 à true
< So sánh nhỏ hơn 5 < 3 à false
<= So sánh nhỏ hơn hoặc bằng 5 <= 5 à true

Dương Hữu Thành, Khoa CNTT, Đại học Mở Tp.HCM 20

10
Phép toán luận lý

Phép
Ý nghĩa
toán
and a and b là đúng khi và chỉ khi a và b cùng đúng.
or a or b chỉ sai khi và chỉ khi a và b đều sai.
not not a là đúng nếu a sai và ngược lại.

Dương Hữu Thành, Khoa CNTT, Đại học Mở Tp.HCM 21

Chuỗi

▪ Chuỗi có thể đặt giữ cặp dấu nháy đơn (‘chuỗi’),


nháy kép (“chuỗi”) hoặc nháy ba ("""chuỗi"""
hoặc '''chuỗi''').

Dương Hữu Thành, Khoa CNTT, Đại học Mở Tp.HCM 22

11
Chuỗi

▪ Dùng phép toán + để cộng hai chuỗi.


▪ Dùng phép toán * để lặp lại một chuỗi.

Dương Hữu Thành, Khoa CNTT, Đại học Mở Tp.HCM 23

Chuỗi

▪ Dùng số chỉ mục để lấy ký tự trong chuỗi, nếu chỉ


mục âm thì tính từ bên phải chuỗi.
▪ Lấy một chuỗi con từ vị trí i đến j trong chuỗi str:
str[i:j]
▪ Lấy một chuỗi con từ vị trí i đến cuối chuỗi:
str[i:]
▪ Lấy chuỗi con đầu đến vị trí thứ i trong chuỗi:
str[:i]

Dương Hữu Thành, Khoa CNTT, Đại học Mở Tp.HCM 24

12
Chuỗi

▪ Ví dụ

Dương Hữu Thành, Khoa CNTT, Đại học Mở Tp.HCM 25

Định dạng chuỗi

▪ Sử dụng phương thức str.format() như sau:

▪ Sử dụng chỉ số giữa {} để chỉ định vị trí đối tượng


truyền vào hoặc sử dụng tên của đối số hoặc kết
hợp cả hai.

Dương Hữu Thành, Khoa CNTT, Đại học Mở Tp.HCM 26

13
Định dạng chuỗi

▪ Ngoài ra, ta có thế kết hợp dấu : để chỉ định một


định dạng cho hiển thị giá trị của đối số, chẳng
hạn giới hạn số chữ số thập phân của số thực.

▪ Ta cũng có thể truyền vào một kiểu dữ liệu từ


điển và dùng [] để lấy giá trị của một key ra.

Dương Hữu Thành, Khoa CNTT, Đại học Mở Tp.HCM 27

Các phương thức khác

▪ s.capitalize(): chuyển ký tự đầu chuỗi thành hoa.


▪ s.center(width[, fillchar]): trả về chuỗi chiều dài
width (nếu width > len(s)), canh chuỗi s ban đầu
vào giữa và hai bên điền các ký tự fillchar.
▪ s.count(sub[, start, end]): đếm số lần sub xuất
hiện trong s tính từ start đến end.
s = "python is simple"
print(s.capitalize()) #Python is simple
print(s.center(30, "-")) #-------python is simple-------
print(s.count("i", 5, 12)) #2

Dương Hữu Thành, Khoa CNTT, Đại học Mở Tp.HCM 28

14
Các phương thức khác

▪ s.find(sub[, start, end]): trả về vị trí tìm thấy sub


trong s tính từ start đến end, và trả về -1 nếu
không tìm thấy.
▪ s.strip([chars]): xoá chars ở đầu và cuối chuỗi s,
mặc định là xoá khoảng trắng.
▪ s.replace(old, new[, max]): thay chuỗi old bằng
new, max để chỉ số lần thay thế (mặc định là 1).
▪ s.split(separator[, num]): tạo danh sách các chuỗi
con tách từ s, ký hiệu cắt là separator (mặc định
khoảng trắng), num quy định số lần cắt.

Dương Hữu Thành, Khoa CNTT, Đại học Mở Tp.HCM 29

Các phương thức khác


s = "*python is simple, python is great*"
print(s.find("is")) #8
print(s.find("is", 1, 7)) #-1

print(s.strip("*"))
#python is simple, python is great

print(s.replace("python", "Py"))
#*Py is simple, Py is great*
print(s.replace("python", "Py", 1))
#*Py is simple, python is great*

print(s.split(" "))
#['*python', 'is', 'simple,', 'python', 'is',
'great*']
print(s.split(" ", 2))
#['*python', 'is', 'simple, python is great*']
Dương Hữu Thành, Khoa CNTT, Đại học Mở Tp.HCM 30

15
Cấu trúc rẽ nhánh

▪ if/elif/else
x = int(input("Nhap x = "))
if (x > 0):
print('%s la so duong' % x)
elif (x < 0):
print('%s la so am' % x)
else:
print('la so 0');

Dương Hữu Thành, Khoa CNTT, Đại học Mở Tp.HCM 31

Cấu trúc rẽ nhánh

▪ Các lệnh có thể lồng các khối lệnh if/elif/else vào


nhau.
▪ Ví dụ: chương trình giải và biện luận phương trình
bậc nhất.
a = int(input("Nhap a = "))
b = int(input("Nhap b = "))
if a==0:
if b==0:
print("Phuong trinh vo so nghiem")
else:
print("Phuong trinh vo nghiem")
else:
print("Phuong trinh co nghiem duy nhat x = ", -b/a)

Dương Hữu Thành, Khoa CNTT, Đại học Mở Tp.HCM 32

16
Cấu trúc lặp

▪ for
# In các phần tử trong danh sách animals
animals = ["dog", "chicken", "tiger"]
for animal in animals:
print(animal)
# In 10 số từ 0 -> 9
for i in range(10):
print(i)
# In 5 số từ 5 -> 9
for i in range(5, 10):
print(i)
# In các số chẵn 2 -> 10
for i in range(2, 11, 2):
print(i)

Dương Hữu Thành, Khoa CNTT, Đại học Mở Tp.HCM 33

Cấu trúc lặp

▪ while
# Đếm số chữ số của số nguyên n
n = int(input("Nhap n = "))
if (n < 10): n = -n

dem = 0
while (n):
dem = dem + 1
n = n//10

print("So chu so la", dem)

Dương Hữu Thành, Khoa CNTT, Đại học Mở Tp.HCM 34

17
Cấu trúc lặp

▪ for/else: khối lệnh else được thực hiện khi chạy


hết danh sách cần duyệt, và sẽ không thực
hiện nếu for được kết thúc bằng break.
▪ while/else: khối lệnh else được thực hiên khi
điều kiện trong while là sai.

Dương Hữu Thành, Khoa CNTT, Đại học Mở Tp.HCM 35

Cấu trúc lặp

▪ Ví dụ
# Tìm các số nguyên tố 2 -> 19
for n in range(2, 20):
for x in range(2, n):
if n % x == 0:
print("%d khong la so nguyen to" % n)
break;
else:
print("%d la so nguyen to" % n)

# Nhập số âm để kết thúc chương trình


while int(input("Nhap mot so khong am")) >= 0:
print("So nhap hop le")
else:
print("So ban nhap vao khong hop le")

Dương Hữu Thành, Khoa CNTT, Đại học Mở Tp.HCM 36

18
Chú ý trong biểu thức điều kiện

▪ Toán từ in và not in để kiểm tra một giá trị có


thuộc một dãy hay không.
s = input("Enter your fruit: ")
if s in ["apple", "banana", "orange"]:
print("Great")

if s not in ["apple", "banana", "orange"]:


print("Sorry")

▪ Toán tử is và is not để kiểm tra hai đối tượng có


giống nhau không.

Dương Hữu Thành, Khoa CNTT, Đại học Mở Tp.HCM 37

Chú ý trong biểu thức điều kiện

▪ Trong Python, ta có thể thực hiện một chuỗi so


sánh, chẳng hạn: a <= b < c == d

▪ Phép so sánh với toán tử bool (not, and, or) thì


not có độ ưu tiên cao nhất, or có độ ưu tiên thấp
nhất, chẳng hạn:

a and not b or c

sẽ tương đương

(a and (not b)) or c

Dương Hữu Thành, Khoa CNTT, Đại học Mở Tp.HCM 38

19
Chú ý trong biểu thức điều kiện

▪ Các kiểu dãy có thể so sánh với nhau cùng kiểu.


Phép so sánh được thực hiện theo thứ tự từ điển:
so sánh các cặp phần tử từ trái sang phải nếu
khác nhau thì quyết định kết quả so sánh.
Ví dụ: (1, 2) < (1, 3) ® True
[2, 3] < [2, 1] ® False
(1, 2) == (1.0, 2.0) ® True
(1, "a", 2.0) <= (1, "b") ® True

Dương Hữu Thành, Khoa CNTT, Đại học Mở Tp.HCM 39

Hàm

▪ Dùng từ khóa def để định nghĩa hàm

def <tên_hàm>([các_tham_số]):
<thân-hàm>

▪ Ví dụ hàm in các số Fibonacci nhỏ hơn n


def fibonacci(n):
a, b = 0, 1

while b < n:
print(b)
a, b = b, a + b

Dương Hữu Thành, Khoa CNTT, Đại học Mở Tp.HCM 40

20
Hàm

▪ Ví dụ hàm giải và biện luận phương thức bậc nhất


def giai_pt_bac_1(a, b):
if a == 0:
if b == 0:
print("Phuong trinh vo so nghiem")
else:
print("Phuong trinh vo nghiem")
else:
print("Phuong trinh co nghiem x = ", -b/a)

▪ Gọi sử dụng hàm theo một trong các cách sau


giai_pt_bac_1(2, 3)
giai_pt_bac_1(a=2, b=3)
giai_pt_bac_1(b=3, a=2)

Dương Hữu Thành, Khoa CNTT, Đại học Mở Tp.HCM 41

Danh sách (List)

▪ Một danh sách gồm nhiều phần tử cách nhau


bằng dấu phẩy.
Ví dụ: a = [1, 2, 3]

▪ Các phần tử trong danh sách có thể có kiểu dữ


liệu khác nhau.
Ví dụ: b = [7, 8, "a", "b", 5.0, 6.0]

▪ Để lấy một phần tử trong danh sách hoặc cắt một


đoạn trong danh sách, thực hiện tương tự như
trên chuỗi. Ví dụ: a[1] -> 2, b[2] -> "a"

Dương Hữu Thành, Khoa CNTT, Đại học Mở Tp.HCM 42

21
Danh sách (List)

▪ Có thể gán giá trị mới cho một phần tử trong


danh sách (mutable). Ví dụ: a[2] = 5
▪ Dùng phép toán + để nối hai danh sách.
▪ Dùng hàm len lấy chiều dài danh sách.
▪ Dùng hàm del xóa một phần tử trong danh sách.

Dương Hữu Thành, Khoa CNTT, Đại học Mở Tp.HCM 43

Các phương thức của danh sách

Phương thức Giải thích


list.append(x) Thêm một phần tử vào cuối danh sách,
tương đương list[len(a):] = [x]
list.extend(L) Thêm các phần tử vào danh sách từ một
danh sách khác.
Tương đương list[len(a):] = L
list.insert(i, x) Chèn phần tử x vào vị trí i
list.remove(x) Xóa phần tử x đầu tiên trong danh sách
list.pop([i]) Trả về phần tử tại vị trí được chỉ định và
đồng thời xóa nó khỏi danh sách. Nếu
không chỉ định i, thì phần tử cuối danh sách
sẽ được chọn

Dương Hữu Thành, Khoa CNTT, Đại học Mở Tp.HCM 44

22
Các phương thức của danh sách

Phương thức Giải thích


list.clear() Xóa tất cả phần tử trong danh sách,
tương đương del list[:]
list.index(x) Trả về vị trí đầu tiên x trong danh
sách
list.count(x) Trả về số lần x xuất hiện tronh danh
sách
list.sort(key=None, Sắp xếp các phần tử trong danh sách
reverse=False)
list.reverse() Đảo ngược danh sách
list.copy() Sao chép danh sách, tương đương
list[:]

Dương Hữu Thành, Khoa CNTT, Đại học Mở Tp.HCM 45

Các phương thức của danh sách

▪ Ví dụ

Dương Hữu Thành, Khoa CNTT, Đại học Mở Tp.HCM 46

23
Bộ (Tuple)

▪ Tuple chứa các giá trị cách nhau bởi dấu phầy (,).
Tuple có thể bao gồm dấu ngoặc “(”, “)” hoặc
không. Ví dụ:

tuple1 = 1, 2.0, "hello"


tuple2 = ("apple", "lemon")

▪ Không thể thay đổi giá trị một phần tử tuple


(immutable). Tuy nhiên có thể tạo tuple với các
đối tượng thay đổi.

Dương Hữu Thành, Khoa CNTT, Đại học Mở Tp.HCM 47

Bộ (Tuple)

▪ Nếu tuple khai báo không có phần tử nào thì phải


dùng dấu ().
Ví dụ: empty = ()

▪ Nếu tuple khai báo chỉ có một phần tử thì phải có


dấu phẩy ở cuối.
Ví dụ: singleton= ("apple", )
hoặc singleton = "lemon",

Dương Hữu Thành, Khoa CNTT, Đại học Mở Tp.HCM 48

24
Tập hợp (Set)

▪ Set là môt tập không có thứ tự và không có


phần tử trùng nhau.
▪ Sử dụng {} hoặc hàm set() để tạo một tập hợp.
▪ Khi tạo tập hợp rỗng phải sử dụng set().

Dương Hữu Thành, Khoa CNTT, Đại học Mở Tp.HCM 49

Tập hợp (Set)

▪ Dùng – để trừ hai tập hợp.


Ví dụ: {1, 2} – {2, 3} = {1}
▪ Dùng | để lấy hợp hai tập hợp.
Ví dụ: {1, 2} | {2, 3} = {1, 2, 3}
▪ Dùng & để lấy giao hai tập hợp.
Ví dụ: {1, 2} & {2, 3} = {2}
▪ Dùng ^ để lấy phần tử chỉ thuộc một trong hai
tập hợp.
Ví dụ: {1, 2} ^ {2, 3} = {1, 3}

Dương Hữu Thành, Khoa CNTT, Đại học Mở Tp.HCM 50

25
Tập hợp (Set)

▪ Ví dụ >>> animals = {"cat", "dog", "chicken", "tiger",


"cat", "chicken"}
>>> print(animals)
{'cat', 'tiger', 'chicken', 'dog'}
>>> a = set("aabbbccaadde")
>>> b = set("cmmnnee")
>>> a
{'c', 'a', 'b', 'd', 'e'}
>>> b
{'c', 'm', 'n', 'e'}
>>> a - b
{'a', 'b', 'd'}
>>> a | b
{'d', 'c', 'e', 'n', 'a', 'b', 'm'}
>>> a & b
{'c', 'e'}
>>> a ^ b
{'d', 'n', 'm', 'b', 'a'}

Dương Hữu Thành, Khoa CNTT, Đại học Mở Tp.HCM 51

Từ điển (Dictionary)

▪ Dictionary là một tập hợp các cặp key/value


không có thứ tự, key bắt buộc phải là duy nhất.
Các cắp key/value cách nhau bằng dấu phẩy (,)

▪ Ví dụ:
user = {
"first_name": "Thanh",
"last_name": "Duong"
}

Dương Hữu Thành, Khoa CNTT, Đại học Mở Tp.HCM 52

26
Từ điển (Dictionary)

▪ Truy xuất hoặc gán giá trị phần tử trong từ điển


thông qua key. Ví dụ:
user["gender"] = "Male";
user["first_name"] -> "Thanh"
▪ Để lấy danh sách key trong từ điển, dùng phương
thức keys(). Ví dụ: user.keys()
à ["first_name", "last_name", "gender"]

Dương Hữu Thành, Khoa CNTT, Đại học Mở Tp.HCM 53

Từ điển (Dictionary)

▪ Để xóa một cặp key/value trong từ điển, dùng del


Ví dụ: delete user["last_name"]
▪ Để kiểm tra một key có trong từ điển không sử
dụng toán tử in.
Ví dụ: "last_name" in user -> True

Dương Hữu Thành, Khoa CNTT, Đại học Mở Tp.HCM 54

27
Từ điển (Dictionary)
>>> user = {"first_name": "Thanh", "last_name": "Duong"}
>>> user["gender"] = "Male"
>>> user
{'last_name': 'Duong', 'first_name': 'Thanh', 'gender': 'Male'}
>>> user["first_name"]
'Thanh'
>>> user.keys()
dict_keys(['last_name', 'first_name', 'gender'])
>>> del user["gender"]
>>> user
{'last_name': 'Duong', 'first_name': 'Thanh'}
>>> "first_name" in user
True
>>> "gender" in user
False
>>> courses = dict(math=10, phy=9, geo=8)
>>> courses
{'math': 10, 'geo': 8, 'phy': 9}
>>> cell_phone = dict([("price", 10), ("color", "blue")])
>>> cell_phone
{'price': 10, 'color': 'blue'}

Dương Hữu Thành, Khoa CNTT, Đại học Mở Tp.HCM 55

Một số kỹ thuật lặp

# Lặp lấy key/value trên dictionary


user = {
"first_name": "Thanh",
"last_name": "Duong",
"gender": "Male“
}
for key, value in user.items():
print(key, ":", value)

# Lặp lấy chỉ số danh sách


animals = ["bird", "dog", "cat"]
for idx, value in enumerate(animals):
print("Animal", idx + 1, ":", value)

Dương Hữu Thành, Khoa CNTT, Đại học Mở Tp.HCM 56

28
Một số kỹ thuật lặp

# Lặp song song trên các danh sách


animals_vn = ["Con chim", "Con cho", "Con meo"]
for en, vi in zip(animals, animals_vn):
print("In English:", en, "; In Vietnamese:", vi)

animals = ["bird", "dog", "cat"]

# Đảo ngược danh sách


for animal in reversed(animals):
print(animal)

# Sắp xếp danh sách theo alphabetical


for animal in sorted(animals):
print(animal)

Dương Hữu Thành, Khoa CNTT, Đại học Mở Tp.HCM 57

Module

▪ Module là một tâp tin python (đuôi *.py) chứa


các câu lệnh và định nghĩa python.
▪ Module cho phép tái sử dụng mã nguồn, chương
trình được chia nhỏ nên dễ bảo trì hơn.
▪ Tên của một module được gán trong biến toàn
cục tên là __name__
▪ Ta có thể import một module vào module khác
sử dụng bằng cách dùng import hoặc kết hợp
from/import.

Dương Hữu Thành, Khoa CNTT, Đại học Mở Tp.HCM 58

29
Module

▪ Ví dụ: ta có gói (python package) tên là example,


và có hai module trong gói này là demo.py và
func.py
▪ Trong func.py có 2 hàm: đếm số chữ số và tính
tổng số chữ số của số nguyên n.
▪ Trong demo.py ta sẽ import func và gọi các hàm
thực thi

+ example
– func.py
– demo.py

Dương Hữu Thành, Khoa CNTT, Đại học Mở Tp.HCM 59

Module

▪ Ví dụ ta có module func.py như sau:


# func.py
def dem_so_chu_so(n):
dem = 0
while (n):
dem = dem + 1
n = n//10

return dem

def tong_chu_so(n):
tong = 0
while (n):
tong = tong + n%10
n = n//10

return tong

Dương Hữu Thành, Khoa CNTT, Đại học Mở Tp.HCM 60

30
Module

▪ Gọi sử dụng các chức năng trong func.py


# demo.py
# import func module từ gói example (python package)
from example import func

print(func.__name__)
n = int(input("Nhap n = "))

# Gọi hàm thực thi


print("So chu so cua %d:" % n, func.dem_so_chu_so(n))
print("Tong so chu so cua %d:" % n, func.tong_chu_so(n))

# Có thể gán một hàm vào một biến


f1 = func.dem_so_chu_so
f2 = func.tong_chu_so
print("So chu so cua %d:" % n, f1(n))
print("Tong so chu so cua %d:" % n, f2(n))

Dương Hữu Thành, Khoa CNTT, Đại học Mở Tp.HCM 61

Module

▪ Nếu trong module có các câu lệnh (nhằm mục


đích khởi động cho module) thì nó chỉ thực thi lần
đầu tiên khi module được import.
▪ Ta có thể import trực tiếp các hàm trong module.
from example.func import dem_so_chu_so, tong_chu_so

▪ Để import tất cả các hàm trong module ta dùng


import *.
from example.func import *

Dương Hữu Thành, Khoa CNTT, Đại học Mở Tp.HCM 62

31
Module

▪ Chú ý với lệnh import này những hàm có tên bắt


đầu bằng “_” sẽ không được import.
▪ Chẳng hạn module func.py có hàm _in_ket_qua
thì với lệnh import * ở trên, hàm này sẽ không
được import vào.

Dương Hữu Thành, Khoa CNTT, Đại học Mở Tp.HCM 63

Module

▪ Khi import một module thì thứ tự python tìm


module này như sau:
▪ Tìm trong các module đã xây dựng sẵn (built-in
modules)
▪ Tìm trong các thư mục được cho bởi sys.path.
sys.path được khởi động tự các vị trí sau:
▪ Thư mục chứa script thực thi hoặc thư mục hiện tại nếu
không có tâp tin chỉ định
▪ Trong biến môi trường PYTHONPATH
▪ Những thư viện mặc định có sẵn nếu PYTHONPATH chưa có
giá trị

Dương Hữu Thành, Khoa CNTT, Đại học Mở Tp.HCM 64

32
Module

▪ Sử dụng hàm có sẵn dir() để xem danh sách các


biến, tên hàm xây dựng trong một module.

Dương Hữu Thành, Khoa CNTT, Đại học Mở Tp.HCM 65

Thực thi Module

▪ Ta có thể thực thi module python trên command


prompt bằng lệnh như sau:
python <tên_module>.py [<các-đối-số>]
▪ Thêm các dòng code sau vào cuối module func.py
if __name__ == "__main__":
import sys
n = int(sys.argv[1])
print("So chu so:", dem_so_chu_so(n))
print("Tong cac chu so:", tong_chu_so(n))

Dương Hữu Thành, Khoa CNTT, Đại học Mở Tp.HCM 66

33
Package

▪ Package được xem là module namespace, bao


gồm có nhiều module.
▪ Ta có thể sử dụng hàm dir (được xây dựng sẵn
trong python) để xem tên các module trong
package.
▪ Mỗi package bắt buộc phải có tập tin
__init__.py để python biết đó là một thư mục
python package. Tập tin này thường là rỗng,
nhưng ta có thể sử dụng nó để khởi động các giá
trị cho package.

Dương Hữu Thành, Khoa CNTT, Đại học Mở Tp.HCM 67

Package

▪ Khi ta import một package thì python sẽ tìm kiếm


các thư mục con của package thông qua các thư
mục trong sys.path

▪ Khi sử dụng from package import item thì


item có thể là
▪ Một package con trong package
▪ Một module trong package
▪ Một hàm, lớp, biến được định nghĩa trong các
module của package

Dương Hữu Thành, Khoa CNTT, Đại học Mở Tp.HCM 68

34
Package

▪ Nếu trong __init__.py của package có định


nghĩa danh sách tên các module trong package
vào biến __all__ thì các module này sẽ được
import từ lệnh from package import *

▪ Nếu __all__ không được định nghĩa thì lệnh


from package import * sẽ không import các
module trong package mà chỉ đảm bảo package
được import và tất cả các tên được định nghĩa
trong package.

Dương Hữu Thành, Khoa CNTT, Đại học Mở Tp.HCM 69

Lớp

▪ Lớp (class) cung cấp khả năng lập trình hướng đối
tượng trong Python.
▪ global & nonlocal

Dương Hữu Thành, Khoa CNTT, Đại học Mở Tp.HCM 70

35
Lớp

▪ Cú pháp khai báo lớp trong Python

class ClassName:
# something to do

▪ Cú pháp khai báo phương thức khởi tạo của lớp


class ClassName:
def __init__(self, *args, **kargs):
# to do something

Dương Hữu Thành, Khoa CNTT, Đại học Mở Tp.HCM 71

Lớp

▪ Tạo thể hiện của lớp dùng tên lớp và truyền vào
danh sách đối số của phương thức khởi tạo
__init__
x = ClassName([các_đối_số])
▪ Ta truy cập vào các thuộc tính và phương thức
của lớp sử dụng toán tử “.”
x.<tên_thuộc_tính>
x.<tên_phương_thức>([các_đối_số])

Dương Hữu Thành, Khoa CNTT, Đại học Mở Tp.HCM 72

36
Lớp

▪ Ví dụ p = PhanSo(5, 4)
p.hien_thi()
q = PhanSo(2, 3)
q.hien_thi()

class PhanSo:
tu_so = 0
mau_so = 1

def __init__(self, tu, mau):


self.tu_so = tu
self.mau_so = mau

def hien_thi(self):
print(str.format("{}/{}",
self.tu_so, self.mau_so))

Dương Hữu Thành, Khoa CNTT, Đại học Mở Tp.HCM 73

Lớp

▪ Python quy ước khai báo thành viên bắt đầu bằng
▪ 2 dấu gạch chân liên tiếp là thành viên private.
▪ 1 dấu gạch chân là thành viên non-public.

Dương Hữu Thành, Khoa CNTT, Đại học Mở Tp.HCM 74

37
Lớp

▪ Khai báo thành viên tĩnh


class A:
@staticmethod
def method1():
pass

@staticmethod
def method2():
pass

▪ Gọi sử dung thành viên tĩnh


A.method1()
A.method2()

Dương Hữu Thành, Khoa CNTT, Đại học Mở Tp.HCM 75

Kế thừa

▪ Cú pháp khai báo kế thừa


class ClassName(BaseClassName):
# something to do

▪ Đa kế thừa
class ClassName(BaseClass1, BaseClass2):
# something to do

Dương Hữu Thành, Khoa CNTT, Đại học Mở Tp.HCM 76

38
Kế thừa
class NhanVien:
▪ Ví __init__(self,
def dụ ho_ten, gioi_tinh, que_quan):
self.ho_ten = ho_ten
self.gioi_tinh = gioi_tinh
self.que_quan = que_quan

def hien_thi(self):
print("Họ tên: ", self.ho_ten)
print("Giới tính: ", self.gioi_tinh)
print("Quê quán: ", self.que_quan)

class GiangVien(NhanVien):
def __init__(self, ho_ten, gioi_tinh, que_quan, hoc_vi):
super().__init__(ho_ten, gioi_tinh, que_quan)
self.hoc_vi = hoc_vi

def hien_thi(self):
super().hien_thi()
print("Học vị: ", self.hoc_vi)

Dương Hữu Thành, Khoa CNTT, Đại học Mở Tp.HCM 77

Lớp trừu tượng

▪ Cú pháp khai báo lớp trừu tượng

from abc import ABC, abstractmethod

class A(ABC):
@abstractmethod
def method1(self):
pass

Dương Hữu Thành, Khoa CNTT, Đại học Mở Tp.HCM 78

39
Xử lý ngoại lệ

▪ Các lỗi xảy ra trong quá trình thực thi chương


trình gọi là ngoại lệ (exception).
▪ Xử lý ngoại lệ tổng quát:
try:
# code khối try
except (ex1, ex2, ...):
# code khối except
else:
# code khối else
finally:
# code khối finally

Dương Hữu Thành, Khoa CNTT, Đại học Mở Tp.HCM 79

Xử lý ngoại lệ

▪ Nếu trong khối try không có ngoại lệ nào xảy ra


thì các khối except sẽ bị bỏ qua.
▪ Nếu có ngoại lệ xảy ra trong khối try, thì phần
code còn lại trong try sẽ bị bỏ qua và tiếp các
ngoại lệ được bắt trong các khối except khớp với
ngoại lệ xảy ra và thực thi trong khối except đó.
Trường hợp nếu không có except nào phù hợp thì
chương trình sẽ dừng lại.

Dương Hữu Thành, Khoa CNTT, Đại học Mở Tp.HCM 80

40
Xử lý ngoại lệ

▪ Khối lệnh else sau try cũng sẽ được thực thi nếu
trong try không có ngoại lệ nào được sinh ra.
▪ Khối lệnh finally luôn được thực thi, bất chấp
có ngoại lệ xảy ra trong khối try hay không.

Dương Hữu Thành, Khoa CNTT, Đại học Mở Tp.HCM 81

Sinh ngoại lệ

▪ Sử dụng câu lệnh raise để sinh một ngoại lệ.


▪ Đối tượng cần truyền cho raise là thể hiện của
Exception hoặc các lớp con của Exception. Nếu ta
truyền vào lớp ngoại lệ cho raise thì nó ngầm định
sẽ gọi phương thức khởi tạo không tham số của
lớp ngoại lệ đó.
raise Exception("Something is wrong.")
raise ValueError("The value is wrong.")
raise NameError

Dương Hữu Thành, Khoa CNTT, Đại học Mở Tp.HCM 82

41
Hướng dẫn thực hành môn Kiểm thử phần mềm

Bài thực hành 1 – Xác định yêu cầu phần mềm


Yêu cầu phần mềm là các công việc, nghiệp vụ được hỗ trợ thực hiện trên máy
tính với phần mềm, có thể phần yêu cầu phần mềm thành 2 loại:
o Yêu cầu chức năng (functional): mô tả hệ thống sẽ làm gì, chẳng hạn
- Đăng nhập, đăng ký
- Tra cứu
- Báo cáo
- Tính toán
o Yêu cầu phi chức năng (non-functional): những yêu cầu không trực tiếp liên
quan đến dịch vụ, mà liên quan đến những thuộc tính hệ thống như:
- Tính dễ sử dụng
- Tính ổn định
- Tốc độ xử lý
- Tính tiến hóa
- Tính hiệu quả
Xác định yêu cầu là quá trình xác định các dịch vụ khách hàng yêu cầu từ hệ
thống và những ràng buộc cho hệ thống hoạt động, phát triển.
Kỹ thuật xác định yêu cầu:
o Phỏng vấn
o Bảng câu hỏi
o Nghiên cứu tài liệu
o Quan sát thực tế
o Kịch bản (Scenario)
o Câu chuyện người dụng (User Stories)
o …
Kỹ thuật phỏng vấn
o Phỏng vấn cá nhân/phỏng vấn nhóm.
o Phỏng vấn tự do/phỏng vấn có định hướng.
Kỹ thuật đặt câu hỏi
o Closed Question (câu hỏi đóng): câu trả lời cho câu hỏi này thường ngăn gọn và
thực tế chẳng hạn:
- Sinh viên có đóng phí khi xin bảng điểm không?
- Sinh viên từ năm 2 mới được đăng ký học phần tự chọn phải không?
Kỹ thuật này dùng tốt các trường hợp: hỏi xác nhận để kết luận và quyết định
thảo luận. Tuy nhiên câu hỏi đóng có thể làm buổi nói chuyện ít cỡi mở, dễ dẫn
đến tính trạng im lặng giữa các bên.
o Open Question (câu hỏi mở): câu trả lời cho câu hỏi này thường dai hơn thường
đi cùng các từ hỏi làm gì (What), như thế nào (HOW), tại sao (WHY) hoặc
thường đi với các từ “Cho tôi biết?”, “Mô tả?”, chẳng hạn:

Dương Hữu Thành © 2019, Khoa CNTT, Đại học Mở Tp.HCM 1


Hướng dẫn thực hành môn Kiểm thử phần mềm

- Mô tả cách thức sinh viên đến xin bảng điểm?


- Sinh viên là gì để đăng ký môn học?
- Cho biết anh thương làm gì để phân lịch thi cho sinh viên?
- Làm thề nào sinh viên có thể mượn phòng để thảo luận và tự học?
Kỹ thuật này dùng tốt cho các trường hợp:
- Phát triển buổi nói chuyện.
- Lấy chi tiết thông tin.
- Làm rõ ý kiến và vấn đề của khách hàng.
o Funnel Question: kỹ thuật này bắt đầu bằng những câu hỏi chung chung, sau đó
chỉ ra từng điểm trong câu trả lời và hỏi chi tiết từng cấp độ.
Sử dụng kỹ thuật này thường bắt đầu bằng câu hỏi đóng và khi tiến trình đã đi
vào luồng (tunnel) thì bắt đầu sử dụng các câu hỏi mở.
Kỹ thuật này dùng tốt cho các trường hợp:
- Làm rõ chi tiết hơn của một điểm nghi vấn nào đó.
- Tăng được sự quan tâm và niềm tin của người đang được phỏng vấn.
o Probing Question: các câu hỏi thăm dò là một chiến lược khác làm rõ chi tiết
vấn đề, chẳng hạn:
Bạn có muốn chúng tôi làm một mẫu dự án xem trước không?
Bạn có muốn thêm chức năng gửi thông bao email trong chức năng chat không?
- Kỹ thuật này dùng tốt cho trường hợp: có sự rõ ràng trong suốt câu chuyện
và đảm bảo bạn hiểu vấn đề.
- Lấy một số thông tin mà người đang được phỏng vấn đê cố né tránh trả lời.
o Leading Question: Kỹ thuật này nhằm dẫn dặt câu trả lời đi theo hướng suy nghĩ
người phỏng vấn, chẳng hạn:
- Chức năng bình luận bài viết chỉ cho phép là user hệ thống hay user khách
cũng thực hiện được?
- Bạn có thấy giải pháp 2 này tốt hơn không?
Kỹ thuật này dùng tốt trong trường hợp: Bạn muốn có câu trả lời như mình mong
muốn, nhưng khiến cho người được phỏng vấn có cảm giác họ được lựa chọn.
Một số chú ý khi phỏng vấn
o Hạn chế dùng thuật ngữ tin học lúc phỏng vấn.
o Người phỏng vấn không nên đưa ý kiến cá nhân.
o Buổi phỏng vấn là thành công nếu hiểu tổng quan những gì (WHAT) khách
hàng làm và cách thức (HOW) thực hiện công việc đó như thế nào?
o Người phỏng vấn nên suy nghĩ cỡi mở, không nên áp đặt những gì mà hệ thống
nên làm.
o Trong lúc phỏng vấn có thể gợi ý các yêu cầu hệ thống, không nên chỉ hỏi
những gì họ muốn.

Dương Hữu Thành © 2019, Khoa CNTT, Đại học Mở Tp.HCM 2


Hướng dẫn thực hành môn Kiểm thử phần mềm

Phần 1. Sử dụng Trello quản lý task trong nhóm


o Sinh viên vào đăng ký tài khoản trên Trello.
o Tạo board cho project của nhóm, add các thành viên vào, và mổi project chứa 4
thẻ chính sau.
- Bài tập quá trình: chứa danh sách các task mà GV yêu cầu nộp.
- Cần làm: chứa danh sách các task phân cho các thành viên trong nhóm để chuẩn
bị làm.
- Đang làm: chứa danh sách các task mà các thành viên đang tiến hành thực hiện.
- Kiểm thử: chứa danh sách các task đang trong giai đoạn kiểm thử.
- Hoàn tất: chứa danh sách các task đã hoàn tất.
Phần 2. Phỏng vấn lấy yêu cầu
Sinh viên làm việc nhóm, mỗi nhóm 4 thành viên, trong đó:
o 2 sinh viên (A) đóng vai trò đại diện nhà phát triển phần mềm.
o 2 sinh viên (B) đóng vai trò khách hàng yêu cầu phát triển sản phẩm.
Nhóm A tiến hành phỏng vấn nhóm B xác định các yêu cầu chức năng và phi chức
năng phát triển phần mềm.
Sinh viên nộp các tài liệu sau vào cuối buổi:
- Biên bản họp: thời gian? nội dung? gồm ai? vai trò từng thành viên? Và trả lời một
số câu hỏi sau phỏng vấn:
o Khách hàng có hiểu những gì họ muốn làm hay không?
o Nhóm phát triển có thực sự hiểu yêu cầu của khách hàng? Có cần thiết một
buổi phỏng vấn khác để xác định rõ yêu cầu khách hàng?
o Có những yêu cầu nào là bất khả thi hay không? Tại sao?
o Những khó khăn và thuận lợi lúc phỏng vấn?
o Bạn có nhận làm dự án này không? Tại sao?
o Thời gian dự kiến hoàn tất trong bao lâu?
- Sinh viên nộp danh sách các câu hỏi và trả lời lúc phỏng vấn.
- Bản mô tả yêu cầu hệ thống.

Dương Hữu Thành © 2019, Khoa CNTT, Đại học Mở Tp.HCM 3


Hướng dẫn thực hành môn Kiểm thử phần mềm

Bài thực hành 2 – Sử dụng Git & GitHub


Git là một trong các hệ thống quản lý phiên bản phân tán phổ biến nhất hiện nay. Cài
đặt Git:
• Tải Git tại https://git-for-windows.GitHub.io/. Double-click vào file cài đặt và thực
hiện theo hướng dẫn.
• Để kiểm tra cài đặt thành công, mở Command Prompt gõ lệnh “git --version” kết
quả sẽ hiển thị giống như sau:

• Tại Command Prompt thiết lập username và email cho git.

GitHub là một nền tảng cung cấp kho lưu trữ mã nguồn git. Nó cho phép nhiều người
làm việc trên một project ở bất cứ nơi đâu. Địa chỉ GitHub: http://github.com/. Bên dưới
các thao tác cơ bản làm việc git & github.

Dương Hữu Thành © 2019, Khoa CNTT, Đại học Mở Tp.HCM 1


Hướng dẫn thực hành môn Kiểm thử phần mềm

Tạo Project ở local rồi đưa lên GitHub


Tạo một project C# Window Form, chẳng hạn đặt tên Calculator.

Click chuột phải vào thư mục Calculator của project và chọn Git Bash Here

Gõ lệnh git init khởi động thư mục Calculator của project là một thùng chứa.

Trong thư mục Calculator sẽ có một thư mục ẩn .git được tạo ra chứa các cấu hình
của thùng chứa.

Dương Hữu Thành © 2019, Khoa CNTT, Đại học Mở Tp.HCM 2


Hướng dẫn thực hành môn Kiểm thử phần mềm

Trở lại Git Bash, gõ lệnh git status để xem danh sách các tập tin, thư mục của
project ở trạng thái thêm mới trong thùng chứa.

Trong thư mục gốc của thùng chứa (thư mục Calculator) tạo tập tin .gitignore để
thiết lập một số tập tin/thư mục không cần thiết đưa lên github, chẳng hạn ta thử bỏ qua
.vs/, bin/ và obj/. Sau đó gõ lại git status sẽ thấy git không còn quan tâm đến các
tập tin/thư mục này nữa.

Gõ lệnh git add . để thêm tất cả tập tin, thư mục project vào Staging Area. Sau đó
gõ git status để xem trạng thái thì sẽ các tập tin/thư mục sẽ đổi màu thành xanh –
trạng thái sẵn sàng đưa lên thùng chứa cục bộ.

Dương Hữu Thành © 2019, Khoa CNTT, Đại học Mở Tp.HCM 3


Hướng dẫn thực hành môn Kiểm thử phần mềm

Gõ lệnh git commit –m “Init Project” đưa project vào thùng chứa cục bộ.

Lênh GitHub (https://github.com/) tạo một thùng chứa, thùng chứa này sẽ liên kết với
thùng chứa cục bộ vừa tạo.

Dương Hữu Thành © 2019, Khoa CNTT, Đại học Mở Tp.HCM 4


Hướng dẫn thực hành môn Kiểm thử phần mềm

Tại trang chủ thùng chứa vừa tạo, click vào nút “Clone or download” (màu xanh) và sao
chép URL git (chú ý minh họa này sử dụng HTTPS).

Trở lại màn hình Git Bash gõ lệnh git remote add <name> “<url>” để kết
nối thùng chứa cục bộ và thùng chứa từ xa (remote respository).

Kề từ lúc này đã có thể đưa các thay đổi từ thùng chứa cục bộ lên thùng chứa từ xa. Bây
giờ gõ lệnh git push origin master để đưa toàn bộ mã nguồn thùng chứa cục
bộ lên thùng chứa trên GitHub.

Trở lại thùng chứa trên GitHub, ta thấy thùng chứa như sau:

Dương Hữu Thành © 2019, Khoa CNTT, Đại học Mở Tp.HCM 5


Hướng dẫn thực hành môn Kiểm thử phần mềm

Bây giờ thử chỉnh sửa form tính toán trong project như sau:

Gõ lệnh git status để thấy những gì mới thay đổi.

Để đưa những thay đổi này lên GitHub lần lượt thực hiện các bước sau:
- Thêm vào Staging: git add .
- Commit vào thùng chứa cục bộ: git commit –m “Update Form”
- Đưa lên thùng chứa từ xa: git push origin master

Dương Hữu Thành © 2019, Khoa CNTT, Đại học Mở Tp.HCM 6


Hướng dẫn thực hành môn Kiểm thử phần mềm

Trở lại thùng chứa trên GitHub sẽ thấy kết quả như sau:

Lấy một project đã tồn tại từ thùng chứa về làm việc trên local
Để lấy project cần có url github của thùng chứa đó. Sau khi có url, tại thư mục chứa
project, gõ git clone để lấy project từ thùng chứa từ xa.
Giả sử lấy project từ thùng chứa từ xa ở trên vào một thư mục ở Destop (đặt tên thư mục
là Demo), tại thư mục Demo, click chuột phải chọn Git Bash Here và gõ lệnh git
clone như trong hình:

Sau lệnh này, vào thư mục Demo ta sẽ thấy project Calculator.
Sau đó có thể chỉnh sửa, thêm mới tập tin/thư mục trong project tùy ý rồi thực thi git
add, git commit và git push để đưa những thay đổi đó về lại thùng chứa. Giả sử
viết thêm hàm xử lý click trên nút “Cộng” như sau:
private void btnCong_Click(object sender, EventArgs e)
{
double a = double.Parse(txtA.Text);
double b = double.Parse(txtB.Text);
double c = a + b;

Dương Hữu Thành © 2019, Khoa CNTT, Đại học Mở Tp.HCM 7


Hướng dẫn thực hành môn Kiểm thử phần mềm

txtKetQua.Text = c.ToString();
}
Dùng lệnh git status để thấy sự thay đổi.

Dùng lệnh git diff xem sự khác nhau giữa các cũ và cái mới thay đổi.

Để đưa những thay đổi này lên GitHub lần lượt thực hiện các bước sau:
- Thêm vào Staging Area: git add <tập-tin> (chú ý chỉ nên add những tập
tin có thay đổi, tranh dùng git add . để add tất cả)
- Commit vào thùng chứ cục bộ: git commit –m “Xu ly nut Cong”
- Đưa lên thùng chứa từ xa: git push origin master

Dương Hữu Thành © 2019, Khoa CNTT, Đại học Mở Tp.HCM 8


Hướng dẫn thực hành môn Kiểm thử phần mềm

Chú ý trước khi bắt đầu thay đổi gì trong thùng chứa, nên thực thưc lệnh git pull để
lấy những thứ mới nhất từ thùng chứa về để làm việc, tránh những xung đột trong mã
nguồn (các thành viên sửa cùng một chổ).
Tạo nhánh
Tạo nhánh tên feature-cal tách từ nhánh master: đứng tại nhánh master thực thi
lệnh git branch như sau:

Chuyển sang nhánh feature-cal để làm việc bằng git checkout như sau:

Bây giờ mọi thay đổi chỉ xảy ra trên nhánh feature-cal, hoàn toàn không ảnh hướng đến
nhánh chính master. Giả sử thêm chức năng “Trừ” hai số vào form tính toán như sau:

Và viết xử lý cho nút “Trừ” như sau:


private void btnTru_Click(object sender, EventArgs e)
{
double a = double.Parse(txtA.Text);
double b = double.Parse(txtB.Text);
double c = a - b;
txtKetQua.Text = c.ToString();
}

Gõ lệnh git status để xem sự thay đổi vừa mới tạo ra

Dương Hữu Thành © 2019, Khoa CNTT, Đại học Mở Tp.HCM 9


Hướng dẫn thực hành môn Kiểm thử phần mềm

Đưa những thay đổi trên nhánh này lên thùng chứa từ xa trên github, thực hiện lần lượt
các lệnh git add, git commit, và git push như sau:

Trở lại trang chủ của thùng chứa Calculator, click vào dropdown list Branch sẽ thấy
nhánh mới feature vừa push lên.

Merge nhánh đang làm việc vào nhánh chính


Có hai cách cơ bản: tạo pull request từ github hoặc merge nhánh đang làm việc vào
nhánh chính ở local và push nhánh chính lên github.
Tạo pull request để merge nhánh feature-cal vào nhánh chính master

Dương Hữu Thành © 2019, Khoa CNTT, Đại học Mở Tp.HCM 10


Hướng dẫn thực hành môn Kiểm thử phần mềm

o Click nút “New pull request” cạnh dropdownlist “Branch”

Hoặc trong các Tab click chọn Tab Pull requests vào click vào nut “New pull request
màu xanh”

o Chọn nhánh master trong dropdown list base và feature-cal trong dropdown list
compare

o Viết phần mô tả (nếu cần), sau đó kéo xuống dưới xem xét những thay đổi, nếu
thấy ổn thì click nút “Create pull request” để tạo.

Dương Hữu Thành © 2019, Khoa CNTT, Đại học Mở Tp.HCM 11


Hướng dẫn thực hành môn Kiểm thử phần mềm

o Tất cả các pull request đã tạo đều nằm trong tab Pull requests. Để thực hiện merge
pull request thì ta đi vào tab này vào chọn pull request muốn thực hiện và click vào
nút “Merge pull request” ® “Confirm merge”

Dương Hữu Thành © 2019, Khoa CNTT, Đại học Mở Tp.HCM 12


Hướng dẫn thực hành môn Kiểm thử phần mềm

o Khi này thì mọi sự thay đổi từ nhánh feature-cal đã trộn vào nhánh chính master:
Thực hiện trộn nhánh đáng làm việc vào nhánh chính ở local, rồi push nhánh chính
lên github.
o Bây giờ tại local chỉnh sửa thêm nhánh feature-cal (giả sử chỉnh kích thước hai nút
Cộng và Trừ nhỏ lại) và commit vào thùng chứa local.

o Merge thay đổi nhánh feature-cal vào nhánh master tại local. Đầu tiên
chuyển về nhánh muốn merge vào (nhánh master) như sau:

o Trước khi merge nên thực hiện lệnh git pull để lấy những thứ mới nhất từ github
về local.

o Thực hiện lệnh git merge để trộn những thay đổi của nhánh feature-cal
vào nhánh master.

o Khi này những thay đổi trên nhánh feature-cal đã được trộn vào nhánh chính
master, và có thể push nhánh master lên thùng chứa từ xa trên github.

Dương Hữu Thành © 2019, Khoa CNTT, Đại học Mở Tp.HCM 13


Hướng dẫn thực hành môn Kiểm thử phần mềm

o Trở lại trang chủ của thùng chứa, xem sự thay đổi của nhánh master

Resolve Conflict
Chuyển qua nhánh feature-cal và thực hiện git pull nhánh master để lấy những thay đổi
mới nhất master trộn vào feature-cal.
Tại nhánh feature-cal sửa hàm xử lý sự kiện click vào nút Cộng như sau:
private void btnCong_Click(object sender, EventArgs e)
{
if (txtA.Text != String.Empty && txtB.Text != String.Empty)
{
double a = double.Parse(txtA.Text);
double b = double.Parse(txtB.Text);
double c = a + b;
txtKetQua.Text = c.ToString();
}
}
Đẩy tất cả những thay đổi từ nhánh này lên github.

Dương Hữu Thành © 2019, Khoa CNTT, Đại học Mở Tp.HCM 14


Hướng dẫn thực hành môn Kiểm thử phần mềm

Đồng thời, chuyển sang nhánh master

Tại nhánh master cũng sửa hàm xử lý sự kiện Cộng như sau:
private void btnCong_Click(object sender, EventArgs e)
{
if (txtA.Text != String.Empty)
{
double a = double.Parse(txtA.Text);
double b = double.Parse(txtB.Text);
double c = a + b;
txtKetQua.Text = c.ToString();
}
}

Đẩy tất cả những thay đổi này lên github.

Dương Hữu Thành © 2019, Khoa CNTT, Đại học Mở Tp.HCM 15


Hướng dẫn thực hành môn Kiểm thử phần mềm

Để tạo ra trường hợp conflict ta có thể tạo pull request trên github hoặc merge ở local.
Bây giờ ta tiến hành merge nhánh feature-cal vào nhánh master tại local, khi đó git sẽ
báo có conflict tập tin Form1.cs vì có hai chỉnh sửa trên hai nhánh khác nhau ở cùng vị
trí.

Mở tập tin Form1.cs sẽ thấy như sau:


private void btnCong_Click(object sender, EventArgs e)
{
<<<<<<< HEAD
if (txtA.Text != String.Empty)
=======
if (txtA.Text != String.Empty && txtB.Text != String.Empty)
>>>>>>> feature-cal
{
double a = double.Parse(txtA.Text);
double b = double.Parse(txtB.Text);
double c = a + b;
txtKetQua.Text = c.ToString();
}
}
Lúc này cần giải quyết conflict thì merge mới thực hiện thành công: phần nằm giữa
“<<<<<<< HEAD” và “=======” là mã nguồn trên nhánh master, còn phần nằm giữa “=======”
và “>>>>>>> feature-cal” là mã nguồn trên nhánh feature-cal, để giải quyết conflict cần
quyết định giữ lại phần nào, xóa phần nào, hoặc giữ lại cả hai, hoặc xóa cả 2.

Dương Hữu Thành © 2019, Khoa CNTT, Đại học Mở Tp.HCM 16


Hướng dẫn thực hành môn Kiểm thử phần mềm

Ở đây là giữa lại phần mã nguồn trên nhánh feature-cal và xóa hết các ký hiệu “<<<<<<<
HEAD”, “=======” và “>>>>>>> feature-cal”, sau đó đưa tất cả thay đổi lên master thì quá
trình merge và resolve conflict hoàn tất.

Dương Hữu Thành © 2019, Khoa CNTT, Đại học Mở Tp.HCM 17


Hướng dẫn thực hành môn Kiểm thử phần mềm

Bài thực hành 3 – Viết Unit Test


PHẦN 1. JUNIT (JAVA)
JUnit là một framework để viết unit test cho ngôn ngữ Java, đóng vai trò quan trọng
trong các ứng dụng test-driven. Để cài đặt môi trường cho JUnit, đầu tiên cần cài đặt bộ
JDK (từ 1.5 trở lên), sau đó download tập tin .jar của JUnit tại https://junit.org/junit4/.

Giả sử ta có lớp PhanSo và cần viết test case kiểm tra phương thức cộng hai phân số.
public class PhanSo {
private int tuSo;
private int mauSo;

public PhanSo(int tu, int mau) {


if (mau == 0)
throw new InputMismatchException("Error!!!");

this.tuSo = tu;
this.mauSo = mau;
}

public PhanSo cong(PhanSo p) {


int t = this.tuSo * p.mauSo + this.mauSo * p.tuSo;
int m = this.mauSo * p.mauSo;

return new PhanSo(t, m);


}

// Các phương thức getter và setter

}
Viết lớp test case.
public class Tester {
private PhanSo p1 = new PhanSo(1, 2);
private PhanSo p2 = new PhanSo(2, 3);

@Test(expected = InputMismatchException.class)
public void testError() {
PhanSo ps = new PhanSo(1, 0);
}

@Test
public void testAddFraction1() {
PhanSo actual = p1.cong(p2);
PhanSo expected = new PhanSo(7, 6);

Assert.assertEquals(expected.getTuSo(),
actual.getTuSo());
Assert.assertEquals(expected.getMauSo(),
actual.getMauSo());
}
}

Dương Hữu Thành © 2019, Khoa CNTT, Đại học Mở Tp.HCM 1


Hướng dẫn thực hành môn Kiểm thử phần mềm

Thực thi các test case.


public class TestRunner {
public static void main(String[] args) {
Result result = JUnitCore.runClasses(Tester.class);

if (!result.wasSuccessful()) {
result.getFailures().forEach((failure) -> {
System.err.println(failure);
});
} else {
System.out.println("success");
}
}
}

Một số lớp quan trọng để viết unit test trong JUnit


Lớp org.junit.Assert cung cấp các phương thức assertion hữu dụng cho viết unit
test, các phương thức thông dụng
o assertEquals(): kiểm tra hai đối tượng/giá trị bằng nhau.
o assertFalse(): kiểm tra biểu thức điều kiện là false.
o assertTrue(): kiểm tra biểu thức điều kiện là true.
o assertNotNull(): kiểm tra một đối tượng khác null.
o assertNull(): kiểm tra một đối tượng là null.
o assertSame(): kiểm tra hai đối tượng tham chiếu đến cùng đối tượng không.
o assertNotSame(): kiểm tra hai đối tượng không trỏ đến cùng đối tượng.
o assertArrayEquals(): kiểm tra hai mảng có bắng nhau không.
Lớp org.junit.TestResult tập hợp các kết quả thực thi test case.
Các Annotation
o @Test: dùng cho phương thức public void, để chỉ định một test case.
• Tham số timeout: chỉ định khoảng thời gian (mili ) tối đa thực hiện test case,
nếu quá thời gian này, test case được đánh dấu là fail.
• Tham số expected: chỉ định lớp ngoại lệ muốn được ném ra khi thực thi
phương thức test case.
o @Before: dùng cho phương thức public void, chỉ định phương thức chạy
trước mỗi phương thức test case.
o @After: dùng cho phương thức public void, chỉ định phương thức chạy sau
mỗi phương thức test case.

Dương Hữu Thành © 2019, Khoa CNTT, Đại học Mở Tp.HCM 2


Hướng dẫn thực hành môn Kiểm thử phần mềm

o @BeforeClass: dùng cho phương thức public static void, chỉ định
phương thức chạy một lần và trước tất cả các phương thức test case trong lớp.
o @AfterClass: chỉ định phương thức chạy một lần và sau khi tất cả các phương
thức test case hoàn tất.
o @Ignore: chỉ định bỏ qua một phương thức khi thực thi test case.
public class DemoTester {
@BeforeClass
public static void start() {
System.out.println("Start");
}

@Before
public void startTest() {
System.out.println("Start Test case");
}

@Test
public void test1() {
System.out.println("Test case 1");
}

@Test
public void test2() {
System.out.println("Test case 2");
}

@After
public void endTest() {
System.out.println("End Test case");
}

@AfterClass
public static void end() {
System.out.println("End");
}
}
Thực thi test này

Lớp org.junit.TestSuite để thực thi nhiều test cùng lúc.


o addTest(): thêm test mới vào suite
o addTestSuite(): thêm cùng lúc nhiều test vào suite.

Dương Hữu Thành © 2019, Khoa CNTT, Đại học Mở Tp.HCM 3


Hướng dẫn thực hành môn Kiểm thử phần mềm

o countTestCases(): đếm số lượng test case được chạy.


o getName(): lấy tên của suite.
o setName(): thiết lập tên cho suite.
o run(): thực thi các test và ghi kết quả vào TestResult.
o testAt(): trả về test ở vị trí chỉ định.
o testCount(): đếm số lượng test trong suite.
Lớp trừu tượng org.junit.TestCase định nghĩa fixture để chạy nhiều test case,
các phương thức thông dụng
o setUp():
o tearDown():
o run(TestResult tests): thực thi các test case và ghi kết quả vào TestResult.
o countTestCases(): đếm số lượng test case được thực thi bởi hàm run().
o getName(): lấy tên test case.
o setName(): thiết lập tên cho test case.
Parameterized Tests cho phép chạy test giống nhau với các giá trị khác nhau được thực
hiện một cách dễ dàng. Giả sử ta có lớp kiểm tra số nguyên tố sau cần viết các test case
kiểm thử.
public class PrimeValidation {
public boolean check(int n) {
if (n >= 2) {
for (int i = 2; i <= Math.sqrt(n); i++)
if (n % i == 0)
return false;

return true;
}

return false;
}
}

Lớp Test được thiết kế như sau


@RunWith(Parameterized.class)
public class PrimeTester {
private int n;
private boolean expected;
private PrimeValidation prime;

public PrimeTester(int n, boolean expected) {


this.n = n;
this.expected = expected;
}

Dương Hữu Thành © 2019, Khoa CNTT, Đại học Mở Tp.HCM 4


Hướng dẫn thực hành môn Kiểm thử phần mềm

@Parameterized.Parameters
public static Collection testData() {
return Arrays.asList(new Object[][] {
{1, false}, {2, true}, {4, false},
{7, true}, {16, false}, {19, true}
});
}

@Before
public void init() {
this.prime = new PrimeValidation();
}

@Test
public void testCase() {
Assert.assertEquals(this.expected,
this.prime.check(this.n));
}
}
Trong đó bắt buộc:
o Gắn annotation @RunWith(Parameterized.class) vào lớp test.
o Phương thức tĩnh testData() có annotation @Parameters trả về một
Collection các đối tượng đại diện cho dữ liệu kiểm thử.
o Phương thức khởi tạo public với số tham số tương đương với một dòng trong dữ
liệu kiểm thử của phương thức testData().
o Khai báo các thuộc tính của lớp tương ứng với một cột trong mỗi dòng dữ liệu của
test data.
o Phương thức test case.

Dương Hữu Thành © 2019, Khoa CNTT, Đại học Mở Tp.HCM 5


Hướng dẫn thực hành môn Kiểm thử phần mềm

PHẦN 2. MS UNIT và NUNIT (C#)


Giả sử tạo một project C# thực hiện các phép toán đơn giản cộng, trừ, nhân, chia các số
nguyên, trong đó phép chia yêu cầu kết quả phải làm tròn về số nguyên gần nhất, chẳng
hạn 1.2 làm tròn thành 1 và 1.5 hay 1.6 làm tròn thành 2.

Thiết kế giao diện tính toán như bên dưới và việc xử lý các phép tính đều thông qua lớp
Caculation.

Tạo một tập tin Calculation.cs chứa lớp public Calculation dùng có phương thức
Execute để thực hiện phép tính đơn giản với hai số nguyên.
namespace Calculator
{
public class Calculation
{

Dương Hữu Thành © 2019, Khoa CNTT, Đại học Mở Tp.HCM 6


Hướng dẫn thực hành môn Kiểm thử phần mềm

private int a;
private int b;

public Calculation(int a, int b)


{
this.a = a;
this.b = b;
}

public int Execute(string CalSymbol)


{
int result = 0;
switch (CalSymbol)
{
case "+":
result = this.a + this.b;
break;
case "-":
result = this.a - this.b;
break;
case "*":
result = this.a * this.b;
break;
case "/":
result = this.a / this.b;
break;
}

return result;
}
}
}
Tạo project kiểm thử để kiểm thử các phép toán trong chương trình trên.
Click chuột phải Solution > Add > New Projects...

Sau đó chọn loại project là “Unit Test Project” và đặt tên là CalculatorTester

Dương Hữu Thành © 2019, Khoa CNTT, Đại học Mở Tp.HCM 7


Hướng dẫn thực hành môn Kiểm thử phần mềm

Tại project Unit Test, thực hiện Add Reference để tham chiếu đến project cần thực hiện
Unit Test.

Chọn project Calculator để test.

Dương Hữu Thành © 2019, Khoa CNTT, Đại học Mở Tp.HCM 8


Hướng dẫn thực hành môn Kiểm thử phần mềm

Viết code kiểm thử phương thức Execute trong lớp Calculation.
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Calculator;

namespace CalculatorTester
{
[TestClass]
public class UnitTest1
{
private Calculation cal;

[TestInitialize]
public void SetUp()
{
this.cal = new Calculation(10, 5);
}

[TestMethod]
public void TestAddOperator()
{
Assert.AreEqual(cal.Execute("+"), 15);
}

[TestMethod]
public void TestSubOperator()
{
Assert.AreEqual(cal.Execute("-"), 5);
}

[TestMethod]
public void TestMulOperator()
{
Assert.AreEqual(cal.Execute("*"), 50);
}

[TestMethod]
public void TestDivOperator()
{
Assert.AreEqual(cal.Execute("/"), 2);
}

[TestMethod]
[ExpectedException(typeof(DivideByZeroException))]
public void TestDivByZero()
{
Calculation c = new Calculation(2, 0);
c.Execute("/");
}
}
}

Trong đó:
o [TestClass]: đánh dấu đây là lớp unit test.
o [TestMethod]: phương thức là một test case.
o [TestInitialize]: phương thức thực thi trước khi chạy các test case.
o [TestCleanup]: phương thức chạy sau cùng trước khi hoàn tất chạy các test
case.

Dương Hữu Thành © 2019, Khoa CNTT, Đại học Mở Tp.HCM 9


Hướng dẫn thực hành môn Kiểm thử phần mềm

o [ExpectedException(typeof(DivideByZeroException))]: kết
quả mong muốn là xuất hiện ngoại lệ DivideByZeroException khi thực hiện
phép chia cho 0.
o [Timeout]: thiết lập timeout khi thực thi test case.
o [Ignore]: bỏ qua tạm thời test case khi thực thi.
o Các phương thức của Assert.AreEqual dùng kiểm tra kết quả của phương thức
Execute có bằng với kết quả mong muốn của test case hay không.
Chạy các unit test đã viết:
o Mở cửa sổ Test Explorer: menu Test > Windows > Test Explorer

o Click vào link “Run All” để chạy tất cả test case

o Kết quả chạy các test case như sau:

o Thêm 1 test case kiểm tra làm tròn trong kết quả phép chia.
[TestMethod]
public void TestDivRound()

Dương Hữu Thành © 2019, Khoa CNTT, Đại học Mở Tp.HCM 10


Hướng dẫn thực hành môn Kiểm thử phần mềm

{
Calculation c = new Calculation(5, 3);
Assert.AreEqual(c.Execute("/"), 2);
}

o Chạy lại tất cả các test case đã viết và kết quả như sau:

Một vài phương thức của Assert:


o Assert.AreEqual(expected, actual [, message]): kiểm tra
expected và actual bằng nhau, message nếu được truyền vào sẽ là thông điệp thông
báo khi expected và actual không bằng nhau.
o Assert.IsNull(object [, message]): kiểm tra một đối tượng là null.
o Assert.IsNotNull(object [, message]): kiểm tra một đối tượng khác
null.
o Assert.AreSame(expected, actual [, message]): kiểm tra
expected và actual tham chiếu đến cùng đối tượng.
o Assert.IsTrue(bool condition [, message]): kiểm tra biểu thức
condition có là true không.
o Assert.IsFalse(bool condition [, message]): kiểm tra biểu thức
condition có là false không.
o Assert.Fail([string message])

Dương Hữu Thành © 2019, Khoa CNTT, Đại học Mở Tp.HCM 11


Hướng dẫn thực hành môn Kiểm thử phần mềm

Kiểm tra ngoại lệ: trong nhiều tình huống cũng cần kiểm tra một ngoại lệ xảy ra hoặc
không xảy ra một ngoại lệ nào đó, sử dụng annotation như sau:
[ExpectedException(typeof(<expected_exception>))]
Tạm bỏ qua một test case nào đó không chạy sử dụng annotation như sau:
[TestMethod, Ignore]

Dương Hữu Thành © 2019, Khoa CNTT, Đại học Mở Tp.HCM 12


Hướng dẫn thực hành môn Kiểm thử phần mềm

DATA-DRIVEN UNIT TEST

Thực thi test case với các dữ liệu test có sẵn: tạo thư mục Data trong project test, click
phải chuột vào thư mục Data > New Item… tạo tập tin TestData.csv.

Chuột phải tập tin TestData.csv chọn Properties, thiết lập thuộc tính “Copy to
Output Directory” thành “Copy always” để tập tin này sẽ được sao chép vào thư mục
bin khi build project.

Nhập dữ liệu vào tập tin TestData.csv như sau:

Thêm reference System.Data vào project test

Dương Hữu Thành © 2019, Khoa CNTT, Đại học Mở Tp.HCM 13


Hướng dẫn thực hành môn Kiểm thử phần mềm

Tạo đối tượng TestContext trong lớp unit test như sau:
public TestContext TestContext { get; set; }

Viết test case sử dụng dữ liệu này chạy các test case như sau:
[DataSource("Microsoft.VisualStudio.TestTools.DataSource.CSV",
@".\Data\TestData.csv", "TestData#csv", DataAccessMethod.Sequential)]
[TestMethod]
public void TestWithDataSource()
{
int a = int.Parse(TestContext.DataRow[0].ToString());
int b = int.Parse(TestContext.DataRow[1].ToString());
int expected = int.Parse(TestContext.DataRow[2].ToString());

Calculation c = new Calculation(a, b);


int actual = c.Execute("+");
Assert.AreEqual(expected, actual);
}

Thực thi test case trên sẽ có kết quả như sau:

Dương Hữu Thành © 2019, Khoa CNTT, Đại học Mở Tp.HCM 14


Hướng dẫn thực hành môn Kiểm thử phần mềm

SQL SERVER UNIT TEST

Tạo project “SQL Server Database Project” trước khi viết Unit Test.

Nạp CSDL vào project: click chuột phải vào project CSDL đã tạo, chọn Import >
Database...

Một cửa sổ “Import Database” hiện ra, click nút “Select Connection...” để chọn CSDL
kết nối.

Dương Hữu Thành © 2019, Khoa CNTT, Đại học Mở Tp.HCM 15


Hướng dẫn thực hành môn Kiểm thử phần mềm

Cơ sở dữ liệu được import vào như sau:

Dương Hữu Thành © 2019, Khoa CNTT, Đại học Mở Tp.HCM 16


Hướng dẫn thực hành môn Kiểm thử phần mềm

Sau khi import CSDL thì project SQL Server đã tạo sẽ có cấu trúc như sau:

Dương Hữu Thành © 2019, Khoa CNTT, Đại học Mở Tp.HCM 17


Hướng dẫn thực hành môn Kiểm thử phần mềm

Tạo unit test cho CSDL, mở cửa sổ SQL Server Object Explorer: VIEW > SQL Server
Object Explorer

Mở rộng thư mục Projects trong cửa sổ và tìm các store procedure để tạo unit test.

Dương Hữu Thành © 2019, Khoa CNTT, Đại học Mở Tp.HCM 18


Hướng dẫn thực hành môn Kiểm thử phần mềm

Click phải chuột vào store procedure muốn tạo unit test và chọn Create Unit Tests...

Tiếp theo chọn project chứa unit test hoặc tạo project unit test mới và đặt tên cho lớp
chứa unit test.

Chọn database kết hợp để test

Dương Hữu Thành © 2019, Khoa CNTT, Đại học Mở Tp.HCM 19


Hướng dẫn thực hành môn Kiểm thử phần mềm

Một pane mặc định sẽ được tạo ra các assertion test cho store procedure. (xóa dòng
code 8)

Có 8 loại Assertion test trong dropdown list

Dương Hữu Thành © 2019, Khoa CNTT, Đại học Mở Tp.HCM 20


Hướng dẫn thực hành môn Kiểm thử phần mềm

o Data Checksum: fail nếu giá trị checksum của kết quả trả về khác với giá trị
checksum mong đợi.
o Empty Resultset: fail nếu result set trả về khác rỗng.
o Execution Time: fail nếu thời gian thực thi dài hơn thời gian mong muốn.
o Expected Schema: fail nếu các cột và các kiểu dữ liệu của result set không khớp
với điều kiện test chỉ định.
o Not Empty Result ResultSet: Fail nếu kết quả result set là rỗng.
o Row Count: fail nếu số lượng dòng kết quả trả về không đúng số lượng mong
muốn.
o Scalar Value: fail nếu một giá trị chỉ định trong result set khác với một giá trị
mong muốn.
o Inconclusive.

Tạo Row Count: trong dropdown list Test Conditions chọn Row Count và click vào nút
bên cạnh, sau đó click chuột phải vào test vừa tạo > chọn Properties.

Và thiết lập thuộc tính Row Count là số dòng mong muốn trả về.

Dương Hữu Thành © 2019, Khoa CNTT, Đại học Mở Tp.HCM 21


Hướng dẫn thực hành môn Kiểm thử phần mềm

Tạo Data Checksum: trong dropdown list Test Conditions chọn Data Checksum và
click nút bên cạnh, click chuột phải vào test vừa tạo > chọn Properties > Click vào
nút của Configuration để cấu hình test.

Chọn kết nối và ấn nút “Retrieve”, khi đó một checksum mong muốn (expected) sẽ
được tạo ra để so sánh xác nhận với quả.

Tạo Scalar Value: trong dropdown list Test Conditions chọn Scalar Value và click nút
bên cạnh, click chuột phải vào test vừa tạo > chọn Properties và thiết lập các thuộc
tính như sau:

Dương Hữu Thành © 2019, Khoa CNTT, Đại học Mở Tp.HCM 22


Hướng dẫn thực hành môn Kiểm thử phần mềm

Điều này có nghĩa là kết quả mong muốn ở dòng 1, cột 5 có giá trị là “0984461466”.

Dương Hữu Thành © 2019, Khoa CNTT, Đại học Mở Tp.HCM 23


Hướng dẫn thực hành môn Kiểm thử phần mềm

Bài 1: Cho hàm tính xn bằng đệ quy, trong đó x là số thực và n là số nguyên bất kỳ, biết
xn được tính như sau:

1 'ế) ' = 0
"+,
! × ! 'ế) ' > 0
! " = $ "/,
!
'ế) ' < 0
!
static double Power(double x, int n)
{
if (n == 0)
return 1.0;
else if (n > 0)
return n * Power(x, n - 1);
else
return Power(x, n + 1) / x;
}

Viết unit test kiểm thử hàm Power với đặc tả yêu cầu như trên.
Bài 2: Một chương trình tính giá trị đa thức tại một giá trị x nào đó. Chương trình nhập
vào số nguyên n là bậc đa thức và n + 1 số nguyên ai (0 ≤ i ≤ n), với ai là hệ số của xi và
giá trị biến nguyên x. Nếu người dùng nhập không đủ n + 1 hệ số cho đa thức hoặc nhập
n âm thì ném ra ngoại lệ ArgumentException, với nội dung lỗi là “Invalid Data”.
Viết Unit Test kiểm tra đoạn chương trình hiện thực hóa yêu cầu trên.
class Polynomial
{
private int n;
private List<int> a;

public Polynomial(int n, List<int> a)


{
if (a.Count() != n + 1)
throw new ArgumentException("Invalid Data");

this.n = n;
this.a = a;
}

public int Cal(double x)


{
int result = 0;
for (int i = 0; i <= this.n; i++)
{
result += (int)(a[i] * Math.Pow(x, i));
}

return result;
}
}

Bài 3: Cho chương trình chuyển đổi số nguyên dương cơ số 10 sang cơ số nguyên k
bất kỳ (với 2 ≤ k ≤ 16). Viết các Unit Test kiểm thử đoạn chương trình này.

Dương Hữu Thành © 2019, Khoa CNTT, Đại học Mở Tp.HCM 24


Hướng dẫn thực hành môn Kiểm thử phần mềm

public class Radix


{
private int number;

public Radix(int number)


{
if (number < 0)
throw new ArgumentException("Incorrect Value");

this.number = number;
}

public string ConvertDecimalToAnother(int radix = 2)


{
int n = this.number;

if (radix < 2 || radix > 16)


throw new ArgumentException("Invalid Radix");

List<string> result = new List<string>();


while (n > 0)
{
int value = n % radix;
if (value < 10)
result.Add(value.ToString());
else
{
switch (value)
{
case 10: result.Add("A"); break;
case 11: result.Add("B"); break;
case 12: result.Add("C"); break;
case 13: result.Add("D"); break;
case 14: result.Add("E"); break;
case 15: result.Add("F"); break;
}
}
n /= radix;
}

result.Reverse();
return String.Join("", result.ToArray());
}
}

Bài 4: Viết lớp Diem để thao tác với điểm trong không gian hai chiều bao gồm hai thuộc
tính hoành độ và tung độ. Lớp HinhChuNhat chứa thông tin của một hình chữ nhật,
biết một hình chữ nhật được xác định bởi 2 điểm là tọa độ điểm trên bên trái và tọa độ
điểm dưới bên phải:

Điểm trên bên trái

Điểm dưới bên phải

Dương Hữu Thành © 2019, Khoa CNTT, Đại học Mở Tp.HCM 25


Hướng dẫn thực hành môn Kiểm thử phần mềm

Lớp HinhChuNhat có hai phương thức thực hiện các chức năng sau:
o Tính diện tích hình chữ nhật
o Kiểm tra hai hình chữ nhật có giao nhau hay không?
Viết Unit Test để kiểm thử các chức năng của chương trình trên.
Bài 5: Một trung tâm gia sư cần quản lý thông tin học viên, một học viên bao gồm thông
tin: mã số học viên, họ tên, quê quán, điểm của ba môn học chính. Vào cuối khoá học,
trung tâm muốn tìm ra một số học viên có thành tích học tập tốt để trao học bổng khuyến
khích. Một học viên được đánh giá là tốt nếu điểm trung bình ba môn học chính từ 8.0
trở lên và không có môn nào trong ba môn chính điểm dưới 5.
a) Viết chương trình cho phép nhập danh sách học viên và xác định danh sách học
viên có thể nhận học bổng.
b) Viết các Unit Test để kiểm thử các chức năng của chương trình trên.

Dương Hữu Thành © 2019, Khoa CNTT, Đại học Mở Tp.HCM 26


Hướng dẫn thực hành môn Kiểm thử phần mềm

Bài thực hành 4 – Python Selenium


PHẦN 1. LÀM QUEN PYTHON
Bài 1: Cho người dùng nhập số nguyên N và xuất các hình giống trong các ví dụ sau
N = 5 N = 5 N = 5 N = 5
***** * * *
***** ** ** ***
***** *** *** *****
***** **** ****
***** ***** *****

Bài 2: Viết chương trình cho phép người dùng nhập dãy n số nguyên khác 0, n (n > 0)
nhập từ bán phím. Viết chương trình tìm số dương lớn nhất và số âm bé nhất, nếu dãy
không có số dương hay số âm thì xuất ra dấu *. Ví dụ thực thi chương trình
n=5 n=5 n=5
a[0] = -1 a[0] = -2 a[0] = 2
a[1] = 4 a[1] = -4 a[1] = 4
a[2] = -8 a[2] = -9 a[2] = 9
a[3] = 7 a[3] = -7 a[3] = 7
a[4] = 2 a[4] = -2 a[4] = 2
Số dương lớn nhất:7 Số dương lớn nhất:* Số dương lớn nhất:9
Số âm bé nhất:-8 Số âm bé nhất:-9 Số âm bé nhất:*

Bài 3: Viết chương trình thực hiện việc xử lý từ điển Anh – Việt, chương trình thực
hiện các chức năng sau:
a) Thêm một từ mới vào từ điển.
b) Hiển thị từ điển, cho biết từ điển hiện tại cho bao nhiêu từ.
c) Tìm kiếm từ tiếng Anh, nếu tìm thấy thì hiển thị key và value. Nếu không tìm thấy
thì thông báo không tìm thấy.
d) Xoá một từ trong từ điển dựa trên key cung cấp.
Bài 4: Một học viên ở trung tâm quản lý bằng kiểu từ điển (dictionary), mỗi nhân viên
bao gồm các thông tin mã nhân viên, tên nhân viên, giới tính, quê quán. Mỗi yêu cầu
viết một hàm riêng và gọi thực thi từng hàm để kiểm tra các chức năng.
Cho trước danh sách 3 nhân viên như sau:
employees = [{
"ma_nv": 1,
"ten_nv": "Nguyễn Văn A",
}, {
"ma_nv": 2,
"ten_nv": "Dương Trọng C",
}, {
"ma_nv": 3,
"ten_nv": "Nguyễn Thanh N",
}]

Dương Hữu Thành © 2019, Khoa CNTT, Đại học Mở Tp.HCM 1


Hướng dẫn thực hành môn Kiểm thử phần mềm

Viết chương trình thực hiện các chức năng sau:


a) Hiển thị danh sách nhân viên:
Ví dụ thực thi chương trình
Mã nhân viên: 1
Tên nhân viên: Nguyễn Văn A
Mã nhân viên: 2
Tên nhân viên: Dương Trọng C
Mã nhân viên: 3
Tên nhân viên: Nguyễn Thanh N
b) Tìm kiếm nhân viên theo tên nhân viên: người dùng nhập từ khoá cần tìm, chương
trình dựa vào tên nhân viên để tìm các nhân viên tương ứng.
Ví dụ thực thi chương trình
Nhập từ khoá tìm kiếm: Văn
=== KẾT QUẢ TÌM KIẾM ===
Mã nhân viên: 1
Tên nhân viên: Nguyễn Văn A
c) Xoá một nhân viên khỏi danh sách: người dùng nhập mã nhân viên cần xoá, hệ
thống tìm nhân viên đó và xoá khỏi danh sách, nếu không tìm thấy nhân viên nào
thì báo “Không có nhân viên này.”.
Ví dụ thực thi chương trình
Nhập mã nhân viên muốn xoá: 2
=== KẾT QUẢ SAU KHI XOÁ ===
Mã nhân viên: 1
Tên nhân viên: Nguyễn Văn A
Mã nhân viên: 3
Tên nhân viên: Nguyễn Thanh N
d) Thêm một nhân viên mới vào danh sách: người dùng nhập các thông tin của nhân
viên mới để thêm vào danh sách.
Ví dụ thực thi chương trình
Nhập mã nhân viên: 5
Nhập tên nhân viên: Dương Hữu T
=== KẾT QUẢ SAU KHI THÊM ===
Mã nhân viên: 1
Tên nhân viên: Nguyễn Văn A
Mã nhân viên: 2
Tên nhân viên: Dương Trọng C
Mã nhân viên: 3
Tên nhân viên: Nguyễn Thanh N
Mã nhân viên: 5
Tên nhân viên: Dương Hữu T

Dương Hữu Thành © 2019, Khoa CNTT, Đại học Mở Tp.HCM 2


Hướng dẫn thực hành môn Kiểm thử phần mềm

PHẦN 2. SELENIUM
Bài 1: Viết ứng dụng cho phép người dùng nhập từ khóa tìm kiếm. Sử dụng selenium
xử lý sự kiện khi người dùng click trên nút tìm kiếm gửi các từ khóa đã nhập lên google
tìm kiếm và rút trích 10 kết quả đầu tiên hiển thị console bao gồm tiêu đề và URL.

Bài 2: Viết chương trình rút trích hết tất cả thông tin hội nghị của trang sau.

https://www.conferenceseries.com/past-conference-reports.php

Vùng rút trích giống như trong hình

Dương Hữu Thành © 2019, Khoa CNTT, Đại học Mở Tp.HCM 3


Hướng dẫn thực hành môn Kiểm thử phần mềm

Bài 3: Viết chương trình trích xuất hết tất cả tín tức hiện có trong phần tin tức của trang
web vnexpress (https://vnexpress.net/), bao gồm lấy tiêu đề, mô tả và đường dẫn ảnh
của tin tức.

Bài 4: Sử dụng selenium kiểm thử trang web đăng ký tài khoản facebook tự động, biết
địa chỉ đăng ký tài khoản facebook: https://www.facebook.com/

Dương Hữu Thành © 2019, Khoa CNTT, Đại học Mở Tp.HCM 4


Hướng dẫn thực hành môn Kiểm thử phần mềm

Bài 5: Viết chương trình xuất phát từ trang http://sis.ou.edu.vn/ tự động chuyển đến
http://dichvu.ou.edu.vn/v2/login.php bằng cách cho tự động click vào menu TIỆN ÍCH
> Xem điểm thi. Thiết kế một giao diện nhập mã số sinh viên và password tương ứng
các thông tin trên trang web (hình dưới) để đăng nhập tự động vào trang web.

Sau đó chuyển sang trang xem điểm thi và rút trích các thông tin như bên dưới
http://dichvu.ou.edu.vn/v2/index.php?m=dichvu&a=xemdiemthihk

Dương Hữu Thành © 2019, Khoa CNTT, Đại học Mở Tp.HCM 5


Hướng dẫn thực hành môn Kiểm thử phần mềm

- Rút trích thông tin sinh viên


- Rút trính thông tin mã môn hoc, tện môn học, số tín chỉ và điểm môn học theo
thang điểm 10 (TH L1) (chỉ rút trích những môn có điểm). Sau đó tính điểm trung
bình của sinh viên đó. Sinh viên hiển thị dạng bảng như ví dụ sau:
Mã môn học Tên môn học Số tín chỉ Điểm môn học

ITEC2504 Lập trình hướng đối tượng 4 8

ITEC4401 Đồ án ngành 6 9

ITEC1404 Ứng dụng Web 3 7

ĐIỂM TRUNG BÌNH: 8.23 (lấy 2 chữ số thấp phân)

Biết công thức tính điểm trung bình như sau:

)∑7ố
:
8ô9
+ố -í/ 0ℎỉ ∗ đ"ể$ $ô/ ℎọ0 ;
Đ"ể$ &' =
-ổ/= +ố -í/ 0ℎỉ

Sau đó chuyển sang trang xem điểm tổng hợp


http://dichvu.ou.edu.vn/v2/index.php?m=dichvu&a=xemdiemthith rút trích điểm

“Điểm TB tích lũy” của học kỳ mới nhất và hiển thị kết quả cạnh điểm trung bình đã
tính trên để so sánh với kết quả tính trên, cho biết kết quả chênh lệch như thế nào.

Dương Hữu Thành © 2019, Khoa CNTT, Đại học Mở Tp.HCM 6

You might also like