Professional Documents
Culture Documents
KTPM 0919 DHT
KTPM 0919 DHT
1
Quy trình phát triển phần mềm
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
Xác định
yêu cầu
Thiết kế
nhanh
Xây dựng
prototype
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
Yêu cầu sơ lược Phát triển Các phiên bảng trung gian
(Outline requirement) (Development) (Intermediate version)
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
...
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.
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
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.
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.
Câu hỏi 2
7
Tổng quan kiểm thử phần mềm
Developer
Tester
8
Tổng quan kiểm thử phần mềm
- Đến deadline
- Thực thi hết
test case
Xem
- Tỷ lệ lỗi ở một xét
mức cho phép
- ...
9
Tổng quan kiểm thử phần mềm
Cẩn thận
(caution)
10
Mục đích kiểm thử phần mềm
Hệ thống
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.
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
fault + failure
13
Câu hỏi 1
Câu hỏi 2
14
Stub & Driver
Driver
Module được
kiểm thử
Câu hỏi
15
QA & QC
QA QC
Quy trình Sản phẩm
Ngừa lỗi Tìm lỗi
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?”
17
Các vai trò kiểm thử phần mềm
Test Analyst/
Test Leader
Test Designer
Khi bug
được tìm
tìm thấy
Nguồn: internet
18
Các vai trò kiểm thử phần mềm
Nguồn: internet
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
▪ 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.
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.
▪ 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.
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.
Acceptance
Test
System
Test
Integration
Test
Unit Test
22
Unit test
Integration test
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)
System test
24
System test
System test
Performance
Scalability Capacity
Testing
Stability
25
System test
System test
26
System test
Câu hỏi
27
Acceptance test
Acceptance test
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.
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.
29
Câu hỏi 1
Câu hỏi 2
30
Các kỹ thuật kiểm thử phần mềm
31
Các kỹ thuật kiểm thử phần mềm
+ =
Black-box White-box Gray-box
32
Câu hỏi
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.
▪ Bottom-up
▪ Module ở mức thấp nhất được kiểm thử trước.
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
Câu hỏi
35
Các tài liệu kiểm thử phần mềm
▪ Test plan
▪ Test report
▪ Test scenario
▪ Test case
▪ Traceability matrix
Test plan
36
Test plan
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.
37
Test scenario
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.
38
Test case
Traceability Matrix
39
Traceability Matrix
Câu hỏi 1
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.
Q&A
41
ThS. Dương Hữu Thành
Khoa CNTT, Đại học Mở Tp.HCM
thanh.dh@ou.edu.vn
1
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.
2
Quy trình kiểm thử hộp đen
3
Các kỹ thuật kiểm thử hộp đen
4
Phân vùng tương đương
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).
Ví dụ
6
Ví dụ
Trung
0 5 7 8 Giỏi 9 10
bình
Ví dụ
7
Bài tập 1
Bài tập 2
8
PHÂN TÍCH GIÁ TRỊ BIÊN
(Boundary Value Analysis)
17
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
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
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ó.
Ví dụ 2
11
Ví dụ 2
invalid
Chẵn Lẻ Chẵn Lẻ
valid
Ví dụ 2
12
Ví dụ 2
return true;
}
Chương trình minh họa bằng C++
▪ Ư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.
13
Bài tập
28
14
Bảng quyết định
15
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.
16
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
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ế.
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
18
Chuyển thành các test case
Bài tập 1
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?
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.
20
Bài tập 3
42
21
Dịch chuyển trạng thái
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”.
23
Ví dụ hệ thống bug tracking
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
25
Ví dụ hệ thống bug tracking
26
Ví dụ sử dụng hệ thống ATM
Đã 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
Bài tập 1
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.
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
Function testing
29
Domain testing
Stress testing
30
Scenario testing
User testing
31
Regression testing
Câu hỏi
32
Q&A
33
ThS. Dương Hữu Thành
Khoa CNTT, Đại học Mở Tp.HCM
thanh.dh@ou.edu.vn
1
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.
2
Tiếp cận 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)
Đa điều
Câu lệnh Nhánh Điều kiện
kiện
Đồ thị luồng
3
Đồ thị luồng
Tuyến tính
if/else
do..while
...
while
switch/case
1 2 3 4
6 7
(*) 8
4
Sơ đồ luồng ® đồ thị luồng
1
4 5
R2
2 3 4
6 R1 7
5
6 7
R3
8
8
Vùng (region)
5
Sơ đồ luồng ® đồ thị luồng
d e
double diemRL false
(diemTB >= 8.5) || true
(diemTB >= 7.0 &&
diemTB = 0 diemRL >= 70)
false true
return kq kq = true
▪ 1, 2, 3, 5, 7, 8
8 7
6
Đường dẫn độc lập
7
Độ phức tạp Cyclomatic
▪ 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
8
Bài tập
KIỂM THỬ
ĐƯỜNG DẪN CƠ CỞ
18
9
Kiểm thử đường dẫn cơ sở
Ví dụ 1
10
Ví dụ 1
▪ 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
Ví dụ 1
Đầ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
11
Ví dụ 2
Ví dụ 2
int tinhTong(int n)
{
int tong = 0;
while (n)
{
tong = 0;
while (n)
{
tong += n % 10;
n = n / 10;
}
12
Ví dụ 2
▪ V(G) = P + 1 = 3 + 1 = 4
e d R1
Ví dụ 2
Đầ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
13
Bài tập 1
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
15
Kiểm thử bao phủ
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
Phủ nhánh
Hoặc
17
Phủ nhánh
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
18
Phủ nhánh
Đầ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
Và
19
Phủ đường dẫn
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
▪ A = -3, B = -4
true (B > 0) && false
Làm sao (A > 0)
xác định
các test
case đó?
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
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
23
Phủ điều kiện
Đầ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
Bài tập 1
return false;
}
24
Bài tập 2
k = count == 6;
}
return k;
}
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.
26
Kiểm thử luồng dữ liệu
▪ Ví dụ
27
Kiểm thử luồng dữ liệu
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 = …
Bài tập 1
29
Bài tập 2
30
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
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.
▪ 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.
32
Lặp lồng nhau
▪ 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.
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.
Q&A
34
ThS. Dương Hữu Thành
Khoa CNTT, Đại học Mở Tp.HCM
thanh.dh@ou.edu.vn
1
Giới thiệu kiểm thử tự động
2
Giới thiệu kiểm thử tự động
3
Giới thiệu Selenium
4
Giới thiệu Selenium
Selenium IDE
5
Selenium IDE
Selenium IDE
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
Selenium IDE
7
Selenium IDE
Tự động nhập liệu
tìm kiếm với Google
Thực thi test
Selenium WebDriver
8
Selenium WebDriver
9
Viết chương trình đầu tiên
driver = webdriver.Chrome(executable_path="...")
driver.get("https://www.google.com.vn/")
print(driver.title)
print(driver.page_source)
driver.close()
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
ele = driver.find_element_by_name("q")
ele.send_keys("software testing")
ele.submit()
driver.close()
11
Tương tác với HTML DOM
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/")
driver.close()
Dương Hữu Thành – Khoa CNTT, Đại học Mở Tp.HCM © 2019 25
13
Tương tác HTML DOM
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()
14
Tương tác với HTML DOM
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"))
15
Wait
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/")
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()
Explicit Wait
17
Q&A
18
ThS. Dương Hữu Thành
Khoa CNTT, Đại học Mở Tp.HCM
thanh.dh@ou.edu.vn
1
Giới thiệu ngôn ngữ Python
2
Cài đặt môi trường
3
Cài đặt môi trường
4
Định danh
5
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
6
Cú pháp căn bản
x = a + b + \
d + e + \
f
al = ["a", "b",
"c", "d"]
a = 5; b = 10
if a < b: print("%s < %s" % (a, b)); print("Next Cmd")
7
Ghi chú
▪ 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.
8
Phép gán
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ị.
9
Các phép toán số học
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
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.
Chuỗi
11
Chuỗi
Chuỗi
12
Chuỗi
▪ Ví dụ
13
Định dạng chuỗi
14
Các phương thức khác
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');
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)
▪ 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
17
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)
18
Chú ý trong biểu thức điều kiện
a and not b or c
sẽ tương đương
19
Chú ý trong biểu thức điều kiện
Hàm
def <tên_hàm>([các_tham_số]):
<thân-hàm>
while b < n:
print(b)
a, b = b, a + b
20
Hàm
21
Danh sách (List)
22
Các phương thức của danh sách
▪ Ví dụ
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ụ:
Bộ (Tuple)
24
Tập hợp (Set)
25
Tập hợp (Set)
Từ điển (Dictionary)
▪ Ví dụ:
user = {
"first_name": "Thanh",
"last_name": "Duong"
}
26
Từ điển (Dictionary)
Từ điển (Dictionary)
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'}
28
Một số kỹ thuật lặp
Module
29
Module
+ example
– func.py
– demo.py
Module
return dem
def tong_chu_so(n):
tong = 0
while (n):
tong = tong + n%10
n = n//10
return tong
30
Module
print(func.__name__)
n = int(input("Nhap n = "))
Module
31
Module
Module
32
Module
33
Package
Package
34
Package
Lớp
▪ Lớp (class) cung cấp khả năng lập trình hướng đối
tượng trong Python.
▪ global & nonlocal
35
Lớp
class ClassName:
# something to do
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ố])
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 hien_thi(self):
print(str.format("{}/{}",
self.tu_so, self.mau_so))
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.
37
Lớp
@staticmethod
def method2():
pass
Kế thừa
▪ Đa kế thừa
class ClassName(BaseClass1, BaseClass2):
# something to do
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)
class A(ABC):
@abstractmethod
def method1(self):
pass
39
Xử lý ngoại lệ
Xử lý ngoại lệ
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.
Sinh ngoại lệ
41
Hướng dẫn thực hành môn Kiểm thử phần mềm
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.
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.
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ộ.
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.
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:
Bây giờ thử chỉnh sửa form tính toán trong project như sau:
Để đư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
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;
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
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:
Đư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.
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.
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”
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.
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.
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();
}
}
Để 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í.
Ở đâ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.
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;
this.tuSo = tu;
this.mauSo = mau;
}
}
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());
}
}
if (!result.wasSuccessful()) {
result.getFailures().forEach((failure) -> {
System.err.println(failure);
});
} else {
System.out.println("success");
}
}
}
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
return true;
}
return false;
}
}
@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.
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
{
private int a;
private int b;
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
Tại project Unit Test, thực hiện Add Reference để tham chiếu đến project cần thực hiện
Unit Test.
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.
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 Thêm 1 test case kiểm tra làm tròn trong kết quả phép chia.
[TestMethod]
public void TestDivRound()
{
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:
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]
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.
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());
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.
Sau khi import CSDL thì project SQL Server đã tạo sẽ có cấu trúc như sau:
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.
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.
Một pane mặc định sẽ được tạo ra các assertion test cho store procedure. (xóa dòng
code 8)
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ề.
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:
Đ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”.
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;
this.n = n;
this.a = a;
}
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.
this.number = number;
}
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:
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.
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",
}]
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
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/
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
ITEC4401 Đồ án ngành 6 9
)∑7ố
:
8ô9
+ố -í/ 0ℎỉ ∗ đ"ể$ $ô/ ℎọ0 ;
Đ"ể$ &' =
-ổ/= +ố -í/ 0ℎỉ
“Đ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.