Professional Documents
Culture Documents
HÀ NỘI - 2020
ĐẠI HỌC QUỐC GIA HÀ NỘI
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ
HÀ NỘI - 2020
1
LỜI CẢM ƠN
Để hoàn thành luận văn này tôi xin chân thành gửi lời cảm ơn đến PGS. TS. Hoàng
Xuân Huấn cùng các thầy cô trong khoa Công nghệ thông tin – Đại học Quốc Gia Hà Nội
đã đóng góp ý kiến, nhận xét, quan tâm chỉ bảo và tạo cho tôi những điều kiện tốt nhất từ
khi bắt đầu cho tới khi hoàn thành luận văn của mình.
Đồng thời, tôi cũng xin gửi lời cảm ơn đến gia đình, bạn bè và đồng nghiệp đã
luôn quan tâm, chia sẻ, động viên và tạo mọi điều kiện để tôi có thể hoàn thành tốt mọi
công việc trong quá trình thực hiện luận văn.
Mặc dù đã rất cố gắng trong quá trình thực hiện nhưng luận văn không thể tránh
khỏi những thiếu sót, tôi rất mong nhận được sự góp ý của các thầy cô và bạn bè.
Học viên
Phạm Thị Hải Yến
3
MỤC LỤC
LỜI CAM ĐOAN ..........................................................................................................1
LỜI CẢM ƠN ................................................................................................................2
MỤC LỤC ......................................................................................................................3
DANH MỤC HÌNH VẼ.................................................................................................6
DANH MỤC BẢNG BIỂU ...........................................................................................8
DANH MỤC CÁC KÝ HIỆU, CHỮ VIẾT TẮT VÀ CÁC THUẬT NGỮ ..............9
LỜI MỞ ĐẦU ..............................................................................................................10
CHƯƠNG 1: GIỚI THIỆU VỀ KIỂM THỬ PHẦN MỀM ....................................12
1.1. Giới thiệu về kiểm thử phần mềm......................................................................... 12
1.2. Phát triển hướng kiểm thử TDD (Test Driven Development) ............................ 13
1.2.1. Khái niệm ..................................................................................................... 13
1.2.2. Các cấp độ TDD ........................................................................................... 16
1.2.3. Các lỗi thường gặp khi áp dụng TDD .......................................................... 16
1.3. Phát triển hướng hành vi BDD (Behaviour Driven Development) .................... 16
1.3.1. Khái niệm ..................................................................................................... 16
1.3.2. Quy trình phát triển phần mềm truyền thống ............................................... 18
1.3.3. Quy trình phát triển theo hướng BDD ......................................................... 18
CHƯƠNG 2. GIỚI THIỆU VỀ CÔNG CỤ KIỂM THỬ TỰ ĐỘNG VÀ MÔ HÌNH
THIẾT KẾ PAGE OBJECT MODEL (POM) .........................................................20
2.1. Công cụ kiểm thử tự động Cucumber .................................................................. 20
2.1.1. Khái niệm ..................................................................................................... 20
2.1.2. Ngôn ngữ Gherkin........................................................................................ 20
2.1.3. Cách chạy một Cucumber Junit test ............................................................. 22
2.1.4. Chu trình....................................................................................................... 23
2.1.5. Sơ đồ chu trình làm việc xử lý các bước trong cucumber ........................... 27
2.1.6. Cấu trúc dự án cài đặt Cucumber ................................................................. 28
2.1.7. Các thư viện sử dụng để chạy Cucumber..................................................... 28
2.2. Selenium WebDriver .............................................................................................. 29
2.2.1. Khái niệm ..................................................................................................... 29
2.2.2. Giới thiệu về đối tượng UI (Locators) ......................................................... 31
2.2.2.1. Xác định phần tử Web theo ID .......................................................... 31
2.2.2.2. Xác định phần tử Web theo Name.....................................................32
4
DANH MỤC CÁC KÝ HIỆU, CHỮ VIẾT TẮT VÀ CÁC THUẬT NGỮ
STT Tiếng Anh Tiếng Việt Viết tắt
1 Automation Test Kiểm thử tự động AT
2 Business Analyst Nhân viên phân tích nghiệp vụ BA
3 Behavior Driven Phát triển hướng hành vi BDD
Development
4 Continuous Integration Tích hợp liên tục CI
5 Developer Lập trình viên
6 Maintenance Bảo hành, bảo trì
7 Manual Test Kiểm thử thủ công
8 Page Object Model Mô hình Page Object POM
9 Refactor Tái cấu trúc
10 Regression Test Kiểm thử hồi quy
11 Software Testing Kiểm thử phần mềm
12 Test case Trường hợp kiểm thử
13 Test Driven Development Phát triển hướng kiểm thử TDD
14 Tester Kiểm thử viên
15 Test script Kịch bản kiểm thử
10
LỜI MỞ ĐẦU
Trong nhiều năm qua, tự động hóa được ứng dụng ở rất nhiều lĩnh vực nhằm giảm
thời gian, nhân lực và sai sót. Ngành công nghệ thông tin mà cụ thể là phát triển phần
mềm cũng không ngoại lệ. Một sản phẩm công nghệ thông tin hay phần mềm có chất
lượng không thể thiếu hoạt động kiểm thử phần mềm, trong khi đó hoạt động này lại tiêu
tốn và chiếm tỷ trọng khá lớn công sức và thời gian trong một dự án. Do vậy, nhu cầu tự
động hoá kiểm thử phần mềm cũng được đặt ra. Việc áp dụng kiểm thử tự động hợp lý sẽ
mang lại thành công cho hoạt động kiểm thử phần mềm cũng như nâng cao chất lượng
của sản phẩm phần mềm. Kiểm thử tự động giúp giảm bớt công sức thực hiện, tăng độ
tin cậy và rèn luyện kỹ năng lập trình cho kiểm thử viên.
Selenium là bộ kiểm thử tự động miễn phí (mã nguồn mở) dành cho các ứng dụng
web trên các trình duyệt và nền tảng khác nhau. Với selenium cùng một số công cụ hỗ trợ
khác như Cucumber, Jenkins, Maven,… kiểm thử viên có thể phát triển thành các
framework hỗ trợ cho viết các kịch bản kiểm thử và chạy các kịch bản này một cách tự
động, giảm nguồn lực, tăng độ tin cậy và nhàm chán của công việc kiểm thử.
Ngoài ra, hiện nay, nhu cầu kiểm thử tự động khá cao nhưng nhân lực trong ngành
này không nhiều, đặc biệt là ở Hà Nội. Các công ty muốn áp dụng kiểm thử tự động trong
quá trình phát triển dự án nhưng việc hiểu biết về kiểm thử tự động khá là mơ hồ và chưa
xây dựng được một framework chuẩn áp dụng cho dự án tại công ty mình.
Dựa vào những lý do trên cùng với những kinh nghiệm 4 năm tôi có được trong
lĩnh vực kiểm thử. Tôi muốn xây dựng một framework kiểm thử tự động hỗ trợ các kiểm
thử viên. Đó là lý do tôi chọn đề tài “Xây dựng ứng dụng kiểm thử phần mềm tự động sử
dụng selenium và webdriver”
Đề tài tìm hiểu cơ sở lý thuyết và kinh nghiệm thực tế về kiểm thử cũng như xây
dựng ứng dụng kiểm thử phần mềm tự động để giảm nhân lực kiểm thử và đảm bảo chất
lượng phần mềm hơn với công việc kiểm thử bằng tay.
Mục tiêu chính của đề tài bao gồm:
Đưa ra những khái niệm cơ bản về quy trình phát triển hiện nay cũng như
việc áp dụng kiểm thử tự động trong quy trình phát triển phần mềm (TDD,
BDD)
Đưa ra những khái niệm cơ bản về các công cụ cần thiết như: Cucumber,
Selenium, Jenkins
Đưa ra một framework nhỏ (kết hợp Cucumber và Selenium) và cách chạy
các kịch bản kiểm thử này bằng Jenkins.
Ngoài phần mở đầu, kết luận và phụ lục phần còn lại của luận văn được chia làm
4 chương, cụ thể như sau:
Chương 1 giới thiệu về kiểm thử phần mềm
11
Chương 2 giới thiệu về công cụ kiểm thử tự động và các loại mô hình thiết
kế và phân tích lý do chọn cũng như ưu nhược điểm của mô hình Page
Object Model (POM)
Chương 3 giới thiệu về hệ thống tích hợp liên tục và giới thiệu công cụ
Jenkins được sử dụng trong dự án thí điểm.
Chương 4 giới thiệu về công ty VIVAS và đánh giá hiệu quả của kiểm thử
tự động khi áp dụng vào dự án của công ty VIVAS.
12
c. Cải thiện chất lượng: Kiểm thử tự động làm giảm rủi ro về mặt chất lượng sản
phẩm, việc kiểm thử được thực hiện một cách nhanh chóng. Có thể tái sử dụng các
trường hợp kiểm thử.
d. Tốc độ xử lý cực nhanh: Nếu mất 5 phút để kiểm thử thủ công thì chỉ cần mất 30s
nếu sử dụng kiểm thử tự động.
e. Chi phí thấp: Việc rút ngắn thời gian và tiết kiệm nhân lực giúp cho việc kiểm thử
tự động trở nên hiệu quả.
Nhược điểm của kiểm thử tự động
a. Ban đầu thì chi phí cho kiểm thử tự động sẽ cao hơn kiểm thử thủ công
b. Để kiểm thử tự động thực hiện được thì vẫn cần con người phải bỏ thời gian, công
sức và tiền bạc, ...
c. Mất chi phí cho các công cụ tự động hóa như bản quyền, bảo trì, tìm hiểu, training.
d. Khó mở rộng hơn nhiều so với kiểm thử thủ công
e. Yêu cầu những người có trình độ chuyên môn cao mới thực hiện được
f. Số lượng công việc phải làm để mở rộng cho kiểm thử tự động sẽ nhiều và khó
hơn so với kiểm thử thủ công.
1.2. Phát triển hướng kiểm thử TDD (Test Driven Development)
1.2.1. Khái niệm
Phát triển hướng kiểm thử TDD (Test Driven Development) là một phương thức
làm việc, hay một quy trình viết mã hiện đại. Lập trình viên sẽ thực hiện thông qua các
bước nhỏ và tiến độ được đảm bảo liên tục bằng cách viết và chạy các bài kiểm thử tự
động. Quá trình lập trình trong TDD cực kỳ chú trọng vào các bước liên tục sau:
a. Viết 1 kịch bản kiểm thử cho hàm mới. Đảm bảo rằng kiểm thử sẽ bị sai.
b. Chuyển qua lập trình sơ khai nhất cho hàm đó để kiểm thử có thể đúng
c. Tối ưu hóa đoạn mã nguồn của hàm vừa viết sao cho đảm bảo kiểm thử vẫn đúng
và tối ưu nhất cho việc lập trình kế tiếp
d. Lặp lại cho các hàm khác từ bước 1. Thực tế, nên sử dụng UnitTestFramework
cho TDD (như JUnit trong Java), chúng ta có thể có được môi trường hiệu quả vì
các kiểm thử được thông báo rõ ràng thông qua màu sắc:
Đỏ: kiểm thử sai, chuyển sang viết chức năng cho kiểm thử đúng
Xanh lá: viết một kiểm thử mới hoặc tối ưu mã nguồn đã viết trong màu đỏ.
Phát triển hướng kiểm thử TDD (Test-Driven Development) là kết hợp phương
pháp Phát triển kiểm thử trước (Test First Development) và phương pháp Điều chỉnh lại
mã nguồn (Refactoring).
Mục tiêu quan trọng nhất của TDD là nghĩ về thiết kế trước khi viết mã nguồn cho
chức năng. Một quan điểm khác lại cho rằng TDD là một kỹ thuật lập trình. Nhưng nhìn
chung, mục tiêu của TDD là viết mã nguồn sáng sủa, rõ ràng và có thể chạy được.
14
Hình 1.1. Chu trình TDD qua màu sắc (từ trang 1minus1.com)
Ba điều luật khi áp dụng TDD
Không cho phép viết bất kỳ một mã chương trình nào cho tới khi nó làm một kiểm
thử bị sai trở nên đúng.
Không cho phép viết nhiều hơn một kiểm thử đơn vị mà nếu chỉ cần 1 kiểm thử
đơn vị cũng đã đủ để sai. Hãy chuyển sang lập trình chức năng để làm đúng kiểm
thử đó trước.
Không cho phép viết nhiều hơn 1 mã chương trình mà nó đã đủ làm một kiểm thử
bị sai chuyển sang đúng.
Các bước thực hiện trong chu trình TDD
15
Hình 1.4. Chu trình làm việc kết hợp TDD và BDD
(Từ trang http://agiledata.org/essays/tdd.html)
18
Ví dụ 1:
(hoặc hệ thống bên ngoài) bắt đầu tương tác với hệ thống (trong bước
When). Givens là điều kiện tiên quyết. Khi Cucumber thực thi bước Given,
nó sẽ cấu hình hệ thống để được một trạng thái rõ ràng như là: tạo, cấu hình
các đối tượng hoặc thêm dữ liệu kiểm thử vào cơ sở dữ liệu
When: Mục đích của When là để mô tả các sự kiện, hành động chính mà
người dùng sử dụng
Then: Việc sử dụng từ khóa 'then' là để xem kết quả sau hành động trong
bước when. Tuy nhiên, bạn chỉ có thể xác minh những thay đổi đáng chú ý
And, But: Dùng để thể hiện có nhiều given when hoặc Then
Background: Từ khóa Background giúp bạn thêm một số bối cảnh vào kịch
bản. Nó có thể chứa một số bước của kịch bản, nhưng sự khác biệt duy nhất
là nó nên được chạy trước mỗi kịch bản
Scenario Outline: Sử dụng giống với Scenario nhưng bắt buộc phải đi cùng
với Data Tables
Examples: Phần ví dụ minh họa
| (Data Tables): Bảng dữ liệu sẽ chạy cho Scenario Outline
@ (Tags): Có thể sử dụng tags để nhóm các feature và scenario lại với nhau,
không lệ thuộc vào file và cấu trúc thư mục.
# (Comments): Bắt đầu dòng bằng dấu # cho biết dòng đó là dòng comment
và không được thực thi
2.1.3. Cách chạy một Cucumber Junit test
Bảng 2.1. Bảng chú thích lệnh trong thư mục chạy Cucumber
@RunWith: Khai báo TestRunner, thường là Cucumber. Các kịch bản kiểm thử
sẽ không chạy được nếu thiếu cái này.
@CucumberOptions: Định nghĩa các lựa chọn cho việc chạy kiểm thử
features: Đường dẫn đến các thư mục feature
glue: Định nghĩa packages khai báo Steps trong Cucumber
monochrome: Dùng để hiển thị đầu ra dễ đọc hơn
dryRun: Dùng để kiểm tra tất cả các bước đã có trong Step Definition hay
chưa
plugin: Để xem báo cáo dạng pretty, xem báo cáo mặc định của cucumber
và xem các báo cáo ngoài của maven
snippets: Quy định tên hàm ở bên CucumberOption
tag: Định nghĩa các scenrio nào sẽ được chạy
2.1.4. Chu trình
Mô tả lại hành vi dưới dạng văn bản thuần túy (sử dụng ngôn ngữ Gherhin)
Hình 2.6. Mã nguồn thực thi các bước trong kịch bản kiểm thử
25
Chạy kịch bản kiểm thử và xem các bước kiểm thử sai
Hình 2.7. Kết quả chạy kịch bản kiểm thử và log khi có trường hợp sai
Lập trình làm cho các bước được kiểm thử đúng
Hình 2.8. Mã nguồn thực thi các bước trong kịch bản kiểm thử
Chạy lại kịch bản kiểm thử và xem những kịch bản đúng
Lặp lại các bước đến khi toàn bộ các kịch bản kiểm thử đúng
26
Hình 2.9. Kết quả chạy các kịch bản kiểm thử đã đúng
27
thể sử dụng các điều kiện if else, các vòng lặp để tăng tính chính xác cho kịch
bản kiểm thử.
Hỗ trợ kiểm thử trên nhiều trình duyệt khác nhau (Firefox, Chrome, Internet
Explorer, Opera, Safari)
Hỗ trợ chạy kiểm thử trên nhiều hệ điều hành khác nhau (Ubuntu, Windows,
IOS …)
Trên thị trường có khá nhiều công cụ kiểm thử Web khác nhau như Quicktest
professional (QTP), công cụ của IBM. Tuy nhiên, các công cụ đó không miễn phí và có
những tính năng hỗ trợ ít hơn so với Selenium. Dựa vào bảng so sánh trên, ta có thể thấy
Selenium là công cụ tuyệt vời để sử dụng.
31
Mở url driver.get(baseUrl);
Ví dụ
Abstract Cung cấp một giao diện cho việc tạo lập các đối tượng mà không cần xác
Factory định lớp cụ thể tạo mỗi đối tượng
Builder Tách rời việc xây dựng một đối tượng phức tạp khỏi biểu diễn của nó sao
cho cùng một tiến trình xây dựng có thể tạo được các biểu diễn khác nhau.
Factory Định nghĩa giao diện để sinh ra đối tượng nhưng để cho lớp con quyết
Method định lớp nào được dùng để sinh ra đối tượng
Prototype Qui định loại của các đối tượng cần tạo bằng cách dùng một đối tượng
mẫu, tạo mới nhờ vào sao chép đối tượng mẫu này.
Singleton Đảm bảo 1 lớp chỉ có 1 instance và cung cấp 1 điểm truy xuất toàn cục
đến nó
Mẫu thiết kế kiến trúc (Structural Patterns)
Những pattern thuộc nhóm này liên quan đến việc thiết lập và định nghĩa quan hệ
giữa các đối tượng. Bao gồm:
Bảng 2.8. Những mẫu thiết kế thuộc nhóm mẫu thiết kế kiến trúc
Adapter Chuyển giao diện của một lớp thành giao diện phù hợp yêu cầu
40
Bridge Tách rời ngữ nghĩa của một vấn đề khỏi việc cài đặt
Composite Tổ chức các đối tượng theo cấu trúc phân cấp dạng cây, các đối tượng trong
cấu trúc được thao tác theo một cách thuần nhất như nhau.
Decorator Gán thêm trách nhiệm cho đối tượng vào lúc chạy (thêm chức năng cho
class).
Facade Cung cấp một interface cấp cao, dễ dùng cho một tập hợp các interface của
hệ thống con (subsystem)
Flyweight Chia sẻ trạng thái chung nhằm thao tác hiệu quả tài nguyên và bộ nhớ
Proxy Cung cấp đối tượng đại diện cho một đối tượng khác để hỗ trợ hoặc kiểm
soát quá trình truy xuất đến đối tượng đó
Chain of cho phép truyền request thông qua một chuỗi đối tượng nhận request
Responsibility
Command mỗi request hoặc command được đóng gói và gửi đi như một đối
tượng
Interpreter Hỗ trợ việc định nghĩa biểu diễn văn phạm và bộ thông dịch cho
một ngôn ngữ
Iterator Truy xuất các element của đối tượng dạng tập hợp tuần tự (list,
array, …)
Mediator Định nghĩa một đối tượng để điều hướng việc giao tiếp giữa một số
đối tượng với nhau.
Memento chỉnh sửa và phục hồi trạng thái bên trong của đối tượng mà vẫn
không vi phạm việc đóng gói dữ liệu
41
Observer Định nghĩa sự phụ thuộc một-nhiều giữa các đối tượng sao cho khi
một đối tượng thay đổi trạng thái thì tất cả các đối tượng phụ thuộc
nó cũng thay đổi theo.
State Cho phép một đối tượng thay đổi hành vi khi trạng thái bên trong
của nó thay đổi
Strategy đóng gọi các thuật toán bằng các lớp, mỗi thuật toán có thể thay đổi
độc lập đối với chương trình sử dụng thuật toán. Cung cấp một họ giải
thuật cho phép client chọn lựa linh động một giải thuật cụ thể khi sử
dụng.
Template Định nghĩa phần khung của một thuật toán, tức là một thuật toán
Method tổng quát gọi đến một số phương thức chưa được cài đặt trong lớp cơ
sở; việc cài đặt các phương thức được ủy nhiệm cho các lớp kế thừa.
Visitor Cho phép định nghĩa thêm phép toán mới tác động lên các element
của một cấu trúc đối tượng mà không cần thay đổi các lớp định nghĩa
cấu trúc đó.
2.4. Mô hình thiết kế Page Object Model (POM)
2.4.1. Lý do chọn mô hình thiết kế Page Object Model (POM)
Dưới đây là một kịch bản kiểm thử đơn giản kiểm tra chức năng đăng nhập vào
hệ thống không thành công do bỏ trống thông tin bắt buộc.
42
Chúng ta có định nghĩa tên phương thức tương ứng với một hoạt động cụ thể,
ví dụ hành động truy cập vào trang chủ, tên phương thức giống như
'gotoHomePage()'.
2.4.4. Ví dụ
Cấu trúc dự án sẽ như sau:
Hình 2.30. Mã nguồn trong PageObjects và PageUIs của trang Đăng nhập
Các hàm định nghĩa các hành động và danh sách các địa chỉ phần tử trên web của kịch
bản kiểm thử trang đăng nhập
Mã nguồn chạy nhiều trình duyệt:
47
Các lập trình viên thực hiện các ticket và đẩy mã nguồn lên thư mục nơi sẽ lưu
giữ mã nguồn của dự án.
Hệ thống CI sẽ lắng nghe và thực hiện kéo mã nguồn về (server CI), build rồi
kiểm thử mã nguồn.
Trong trường hợp build, kiểm thử thất bại, các thành viên trong đội sẽ nhìn thấy
ngay được lỗi phát sinh và các lập trình viên sẽ chịu trách nhiệm sửa lỗi và đẩy
mã nguồn sửa lỗi đó lên nơi lưu trữ.
3.1.2. Áp dụng hệ thống tích hợp liên tục
Quản lý Mã nguồn
Tự động hóa quy trình build
Quá trình build được thực hiện tự động bằng các đoạn script cài sẵn
Thực hiện thường xuyên
Tạo ra các script khác nhau để có thể chạy trên nhiều môi trường khác nhau
Công cụ: Ant, Maven...
Tạo bản build bao gồm kiểm thử
Chèn các kiểm thử vào chương trình
Nhận dạng Mã nguồn có khả năng phát sinh lỗi (kiểm thử mã nguồn)
Công cụ: JUnit, HtmlUnit
Cam kết những thay đổi mỗi ngày
Lấy Mã nguồn về nơi lưu trữ (mainline)
Mỗi khi mã nguồn có thay đổi sẽ build lại (mainline) thông qua build server
Kiểm thử tự động
Được thực hiện bằng các đoạn script viết sẵn
Thực hiện sau khi build xong
Thực hiện trong quá trình lập trình viên build trên máy của họ hoặc vào lúc
CI server build mainline
Báo cáo kết quả cho lập trình viên hoặc những thành viên liên quan
3.1.3. Lợi ích của việc tích hợp liên tục
Giảm rủi ro tích hợp: làm việc trên các dự án có nghĩa là nhiều người đang làm
việc trên các task riêng biệt hoặc các phần của mã nguồn. Càng nhiều người, sự
tích hợp càng nguy hiểm. Tùy thuộc vào vấn đề thực sự tồi tệ như thế nào, việc
sửa lỗi và giải quyết vấn đề có thể gây ra phiền phức và có nghĩa là có nhiều thay
đổi đối với mã nguồn. Thực hiện tích hợp hàng ngày hoặc thậm chí thường xuyên
hơn có thể giúp giảm thiểu các loại vấn đề này ở mức tối thiểu.
Chất lượng mã nguồn cao hơn: Không cần phải lo lắng về các vấn đề xảy ra và
tập trung nhiều hơn vào các tính năng của hệ thống giúp viết ra sản phẩm có chất
lượng cao hơn.
51
Mã nguồn trên version control luôn hoạt động: Nếu cam kết phần nào đó làm
hỏng việc build, đội phát triển sản phẩm sẽ nhận ra điều này ngay lập tức, và vấn
đề sẽ được giải quyết trước khi mã nguồn bị kéo lỗi về
Giảm tranh luận gay gắt trong đội ngũ phát triển sản phẩm: Có một hệ thống
khách quan tại chỗ giúp giảm tần suất cãi nhau giữa các thành viên
Giúp thành viên kiểm thử giảm phiền phức: Có nhiều phiên bản và build của mã
nguồn giúp chia cắt và tìm kiếm lỗi một cách hiệu quả, giúp công việc của đội
kiểm thử dễ dàng hơn.
Giảm thời gian triển khai: Triển khai dự án là một công việc rất nhàm chán và
tốn thời gian, và việc tự động hoá quá trình này là rất cần thiết
Tăng sự tự tin và tinh thần: công việc không hiệu quả nếu luôn thường trực nỗi
sợ làm hỏng cái gì đó, và họ có xu hướng tạo ra kết quả tốt hơn và có thể tập
trung năng lượng làm việc hơn nếu không phải lo lắng về những hậu quả có thể
xảy ra từ hành động của họ.
Circle CI
Jenkins
AppVeyor
CodeShip
Drone
Semaphore CI
Buildkite
Wercker
TeamCity
52
dùng cuối được kết nối tự động đến máy chủ lưu trữ gần nhất về mặt địa lý, thay vì phải
kết nối tới máy chủ gốc của Content Provider.
Công ty liên tục có kế hoạch cải tiến sản phẩm và tính năng hiện tại đồng thời tạo
ra các sản phẩm và tính năng mới. Mỗi khi một sản phẩm hay tính năng mới nào được
xuất bản ra ngoài thị trường, sản phẩm và tính năng đó và những sản phẩm và tính năng
cũ đều phải được tiến hành kiểm thử trên các môi trường mà sản phẩm đó hỗ trợ.
Các ứng dụng được phát triển và cài đặt trên các môi trường khác nhau
Hệ điều hành: Windows, Android, IOS …
Trình duyệt: IE, Firefox, Chrome …
Môi trường: Dev, Staging, Production, …
4.1.2. Quy trình kiểm thử trước đây tại VIVAS
VIVAS trước đây sử dụng kiểm thử thủ công hoàn toàn. Trong kiểm thử thủ công,
kiểm thử viên sẽ kiểm thử tất cả các tính năng thiết yếu của ứng dụng hoặc phần mềm.
Kiểm thử viên thực hiện các kịch bản kiểm thử và tạo báo cáo kiểm thử mà không cần sự
trợ giúp của bất kỳ công cụ kiểm thử phần mềm tự động nào. Đây là một phương pháp
kiểm thử cổ điển, giúp tìm lỗi trong các hệ thống phần mềm, thường được tiến hành bởi
một kiểm thử viên có kinh nghiệm và thực hiện theo quy trình kiểm thử phần mềm.
56
Hình 4.1. Quy trình kiểm thử trước đây tại VIVAS
Theo như sơ đồ trên, trước khi bất kỳ một tính năng nào được thêm/sửa/xóa/nâng
cấp và đưa ra thị trường đều phải kiểm thử qua 4 môi trường. Trong mỗi môi trường đều
phải kiểm thử trên nhiều trình duyệt, nhiều kênh và trải qua nhiều vòng kiểm thử.
57
Số lượng kịch bản kiểm thử cho mỗi dự án (như TVOD, SMSMKT, SMSBRN,
VasDealer, IPCamera …) có thể giao động từ 100 đến khoàng 1000 trường hợp kiểm thử
cho mỗi môi trường, mỗi trình duyệt và mỗi vòng. Dưới đây là một số thống kê về số
lượng kịch bản kiểm thử của một vài chức năng trong hệ thống. Số lượng này tính theo
một môi trường (Ví dụ: môi trường Staging+Firefox+Web+Round 1)
Bảng 4.1. Bảng thống kê số kịch bản kiểm thử của một vài dịch vụ tại Vivas
TVOD 1092
SMSMKT 1038
VasDealer 832
IPCamera 420
PlayBox 126
Viettalk 783
… …
Để kiểm thử cho tất cả ứng dụng, hệ điều hành, trình duyệt và cơ sở dữ liệu khác
nhau, số lượng kịch bản kiểm thử sẽ rất lớn. Bên cạnh đó phải kiểm thử cả những phần
ảnh hưởng khi thêm/sửa/xóa một tính năng mới. Có thể thấy nguồn nhân sự cho kiểm thử
hồi quy (Regression test) và các kiểm thử cho tính năng mới sẽ rất mất thời gian và chi
phí.
Từ những khó khăn của kiểm thử thủ công, tôi đã xây dựng Framework tích hợp
điểm mạnh của BDD- Cucumber-Selenium-CI để hỗ trợ quá trình kiểm thử, build dự án,
phát hành sản phẩm với chất lượng tốt hơn. Nhằm mục đích tiết kiệm nguồn lực, chi phí
và thời gian. Đồng thời giảm sự nhàm chán của công việc kiểm thử thủ công hiện nay của
công ty.
Dưới đây là kết quả cài đặt, chạy thử và đánh giá kết quả của framework tại công
ty VIVAS
58
4.2. Cài đặt và áp dụng kiểm thử tự động vào các dự án của VIVAS
4.2.1. Cấu trúc dự án
if (ItemText.equals(ExpectedText)) {
((JavascriptExecutor)
driver).executeScript("arguments[0].scrollIntoView(true);", elements.get(i));
Thread.sleep(1000);
if (elements.get(i).isDisplayed()) {
elements.get(i).click();
} else {
((JavascriptExecutor)
driver).executeScript("arguments[0].click();", elements.get(i));
}
break;
}
}
}
Một số hoạt động của con trỏ chuột
public void hoverMouseToElement(WebDriver driver, String locator) {
element = driver.findElement(By.xpath(locator));
action = new Actions(driver);
action.moveToElement(element).perform();
}
javascriptExecutor.executeScript("arguments[0].setAttribute(arguments[1]
, arguments[2])", element, "style",
"border: 5px solid yellow; border-style: dashed;");
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
javascriptExecutor.executeScript("arguments[0].setAttribute(arguments[1]
, arguments[2])", element, "style", originalStyle);
}
Sử dụng framework đã xây dựng để kiểm thử
Sau khi xây dựng được các hàm dùng chung, toàn bộ những kiểm thử viên
có thể sử dụng hàm này trong những lớp pageObject. Tất cả các lớp pageObject
đều dùng tính kế thừa từ AbstractPage trong ngôn ngữ Java.
public class AccountInformationPageObject extends AbstractPage {
}
Ví dụ:
Trong hàm nhấn vào nút thay đổi mật khẩu cần sử dụng hàm chung
clickToElement() đã xây dựng bên trên như sau:
public void clickToChangePasswordButton() {
waitForElementVisible(driver,
AccountInformationPageUI.CHANGE_PASSWORD_BUTTON);
clickToElement(driver,
AccountInformationPageUI.CHANGE_PASSWORD_BUTTON);
}
Trong hàm điền giá trị vào ô nhập mật khẩu cũ cần sử dụng hàm chung
inputToOldPasswordTextbox () đã xây dựng bên trên như sau:
public void inputToOldPasswordTextbox(String value) {
waitForElementVisible(driver,
AccountInformationPageUI.OLD_PASSWORD_TEXTBOX);
sendkeyToElement(driver,
AccountInformationPageUI.OLD_PASSWORD_TEXTBOX, value);
}
64
Hình 4.6. Báo cáo kết quả kiểm thử trên Jenkins
Báo cáo kết quả kiểm thử trên Jenkins: Cho biết kết quả kiểm thử đúng hay sai của
từng kịch bản kiểm thử và từng vòng kiểm thử
Hình 4.9. Báo cáo kết quả kiểm thử trên Extent reports
Ngoài báo cáo trên Jenkins có sẵn, kiểm thử viên có thể tích hợp thêm báo cáo mở
rộng để nhìn kết quả kiểm thử dạng biểu đồ hình tròn trực quan hơn. Đồng thời báo cáo
lấy được cả thông tin về thiết bị dùng để kiểm thử.
Báo cáo TestNG
67
Hình 4.10. Báo cáo kết quả kiểm thử trên TestNG report
Đây là báo cáo đơn giản và dễ hiểu nhất trong các báo cáo. Nhìn vào báo cáo
TestNG, đội phát triển có thể dễ dạng biết kiểm thử viên đã kiểm thử trên trình duyệt nào
với thời gian bao lâu và kết quả kiểm thử đúng/sai bao nhiêu phần trăm.
4.3. Đánh giá kết quả sau khi áp dụng kiểm thử tự động vào dự án của VIVAS
Hiện tại chúng tôi đã viết kịch bản kiểm thử cho khoảng 72% số lượng kịch bản
kiểm thử và đã áp dụng thực tế cho một vài dịch vụ của VIVAS gồm: TVOD, SMSBRN,
SMSMKT, VasDealer. Sau đây là những con số thống kê cho dịch vụ TVOD:
Bảng 4.2. Bảng thống kế số kịch bản kiểm thử đã áp dụng thực tế kiểm thử tự động
Từ thống kê trên, ta dễ dàng nhận thấy tỷ lệ phần trăm số kịch bản kiểm thử kiểm
thử thủ công hoàn toàn được thay thế bằng kiểm thử tự động lên đến 71%. 29% còn lại
buộc phải có yếu tố con người như kiểm thử giao diện, thói quen người dùng, …
68
Hình 4.11. Biểu đồ thống kê tỷ lệ thực hiện được kiểm thử tự động
Thống kê thực tế về thời gian (tính theo manday) khi thực hiện kiểm thử thủ công
và kiểm thử tự động trên một trình duyệt của từng môi trường khi kiểm thử toàn trình dự
án
Bảng 4.3. Bảng thống kê thời gian thực thi của kiểm thử thủ công và tự động
chóng trong khi kiểm thử tự động lại không cần quá nhiều thời gian cho việc chạy lại bộ
TestScript.
100
80 75
Ngày làm việc
58,50
60
61,50
40
20 9
0
0 5 10 15 20
Vòng chạy kiểm thử
Manual Automation
Linear (Manual) Linear (Automation)
Hình 4.12. Biểu đồ so sánh thời gian thực thi giữa kiểm thử thủ công và tự động trên
một trình duyệt
Vậy bài toán hoàn hảo cho kiểm thử phần mềm là ta phải kiểm thử trên mọi trình
duyệt, mọi môi trường, mọi hệ điều hành có thể. Như vậy thời gian mà kiểm thử tự động
tiết kiệm được so với kiểm thử thủ công là rất đáng kể. Biểu đồ bên dưới thể hiện thời
gian dành cho kiểm thử tự động và kiểm thử thủ công khi thực thi kiểm thử trên ba trình
duyệt khác nhau.
70
300
250 225
Ngày làm việc
200
150
100 67,5
58,50
50
27
0
0 5 10 15 20
Vòng chạy kiểm thử
Manual Automation
Linear (Manual) Linear (Automation)
Hình 4.13. Biểu đồ so sánh thời gian thực thi giữa kiểm thử thủ công và tự động trên ba
trình duyệt
4.3.2. Tiết kiệm nguồn nhân lực
Kiểm thử tự động không chỉ giúp doanh nghiệp tiết kiệm thời gian, mà còn giúp
tiết kiệm nguồn lực vào giai đoạn kiểm thử. Với mẫu thống kê là 446 kịch bản kiểm thử
được giao cho đội gồm 5 kiểm thử viên. Ta có những bài toán so sánh như biểu đồ bên
dưới. Nếu chỉ có một nhân viên kiểm thử làm 446 kịch bản kiểm thử trong bốn môi
trường, ba trình duyệt, mỗi môi trường kiểm thử bốn vòng thì kiểm thử thủ công sẽ mất
191 ngày làm việc còn kiểm thử tự động chỉ mất 63 ngày làm việc. Bài toán tiết kiệm
nguồn lực sẽ thể hiện được khi có sự tham gia từ hai tester trở lên. Trong kiểm thử thủ
công số nguồn lực tham gia vào dự án phải làm việc song song trong toàn bộ quá trình
kiểm thử. Tuy nhiên, với kiểm thử tự động thì số nguồn lực chỉ phải tham gia song song
trong quá trình viết TestScript. Sau đó đội kiểm thử viên sẽ rút được nguồn lực chỉ còn
một người thực hiện chạy TestScript và bảo trì cho bộ TestScript đó.
71
0
0 10 20 30 40 50 60 70 80 90 100 110 120 130 140 150 160 170 180 190 200
-1
-2
-3
-4
-5
-6
Ngày làm việc
Hình 4.14. Bảng so sánh nguồn lực thực hiện kiểm thử thủ công và tự động
Với việc triển khai kiểm thử tự động, các kịch bản kiểm thử có thể chạy qua đêm
(ngoài giờ làm việc) và có thể chạy trên nhiều server khác nhau, thời gian để một kiểm
thử viên kiểm tra kết quả các các kịch bản chỉ mất khoảng 2-3 ngày làm việc cho một môi
trường kiểm thử. Đặc thù của các dự án của VIVAS là thường xuyên phải nâng cấp dự án
vào ban đêm nhằm đảm bảo độ ảnh hưởng là ít nhất đối với người dùng thật. Như vậy
kiểm thử tự động, đặc biết là Jenkins đem lại hiệu quả cực kì cao với VIVAS.
4.4. Những khó khăn khi triển khai hệ thống kiểm thử tự động trong công ty
VIVAS
Việc tìm nhân lực vừa có kỹ năng kiểm thử vừa có kỹ năng lập trình gặp khó khăn
bởi nhiều bạn nhân viên kiểm thử có kỹ năng kiểm thử tốt nhưng tư duy lập trình
không tốt, các bạn có kỹ năng lập trình tốt thì không muốn làm kiểm thử.
Khi một tính năng có nhiều sự thay đổi về cách tổ chức UI thì mất nhiều thời gian
để bảo trì mã nguồn của framework.
Kiểm thử tự động sẽ chỉ có hiệu quả cao nhất đối với dự án dài, cần kiểm thử hồi
quy nhiều. Các dự án ngắn, đòi hỏi hoàn thành dự án sớm thì việc triển khai kiểm
thử tự động sẽ không hiệu quả.
72
KẾT LUẬN
Cách mạng công nghiệp lần thứ tư đánh dấu kỷ nguyên vạn vật kết nối Internet.
Nó xảy ra dựa trên sự hội tụ của nhiều công nghệ trong đó có công nghệ cốt lõi có công
nghệ thông tin với sự phát triển không ngừng của công nghệ Internet từ thời kỳ kết nối
nội dung như email đến mạng xã hội, Internet vạn vật, Internet kết nối thiết bị máy móc
kết nối quá trình vận hành của các nhà máy. Hiện nay, nền công nghiệp 4.0 đang phát
triển mạnh mẽ, kéo theo sự phát triển của rất nhiều ngành nghề, đặc biệt là ngành công
nghệ thông tin. Do đó, yêu cầu về nhân lực trong mảng này cũng đòi hỏi các ứng viên cần
phải có kỹ năng tốt hơn nữa về lập trình, các kỹ năng về tự động hóa....
Từ đây, có thể thấy được nhu cầu nhân lực có kiến thức và kinh nghiệm về kiểm
thử tự động là rất lớn. Do đó, đề tài về kiểm thử tự động sẽ là tiềm năng lớn cho tương lai
của mảng kiểm thử nói riêng và công nghệ thông tin nói chung.
Trong quá trình tìm hiểu và nghiên cứu, luận văn đã đưa ra những khái niệm và
hướng áp dụng của Selenium và các công cụ liên quan khác trong kiểm thử phần mềm.
Dựa vào kết quả nghiên cứu và áp dụng kiểm thử tự động tại công ty VIVAS, tôi thấy
rằng việc ứng dụng selenium và các công cụ liên quan trong các dự án phần mềm là hoàn
toàn khả thi. Do thời gian có hạn, tôi chỉ đưa ra một framework cơ bản nhất để có thể áp
dụng và chạy thử nghiệm luôn, framework vẫn còn nhiều phần cần phải cải tiến và cập
nhật thêm (ví dụ: DataDriven, Dynamic Locator, tốc độ chạy các kịch bản kiểm thử).
Việc cải tiến framework sẽ được nghiên cứu và cập nhật trong thời gian tới.
74