ĐẠI HỌC QUỐC GIA HÀ NỘI
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ
BÁO CÁO TỔNG KẾT
MÔN: CÁC VẤN ĐỀ HIỆN ĐẠI CỦA
CÔNG NGHỆ PHẦN MỀM
ĐỀ TÀI: KIỂM THỬ ỨNG DỤNG iOS
VÀ ANDROID BẰNG CALABASH
TRONG MÔI TRƯỜNG TÍCH HỢP
LIÊN TỤC VỚI CRUISECONTROLRB
Cán bộ giám sát: TS. Võ Đình Hiếu
1. Dương Hữu Hiếu
2. Nguyễn Đình Đại
3. Nguyễn Văn Kháng
Mục Lục
Phân công công việc
Trình bày viết định nghĩa các bước với Calabash console
Ý tưởng và cách thức viết test Cross-pla%orm
Viết kịch bản test cross-pla%orm cho app VietGag
I. Calabash
1. Các vấn đề kiểm thử trên ứng dụng di động
- Cần một môi trường thực tế nhất có thể: giả lập rất tốt, nhưng vẫn chưa đủ.
Simulator hiện nay chưa thể giả lập một số thao tác như rotate – xoay màn
hình, con quay hồi chuyển.
- Rất nhiều loại thiết bị - các mẫu điện thoại máy tính bảng mới xuất hiện liên
tục, theo đó các loại màn hình, độ phân giải, hệ điều hành, bộ vi xử lý cũng rất
khác nhau.
cần thiết.
b. Kiến trúc của Calabash
Mô hình thiết kế
- Calabash được thiết kế theo mô hình client-server nên gồm có 2 phần:
• Client library được viết bằng ruby
• Server framework được viết bằng objective-C
- Calabash client bao gồm các thư viện calabash-android để kiểm thử cho ứng
dụng android và calabash-ios để kiểm thử cho ứng dụng iOS. Calabash server
cũng có calabash iOS và Android Framework tương ứng.
- Calabash client và Calabash server giao tiếp với nhau bằng jSON thông qua
giao thức http. Calabash server sẽ nhận yêu cầu từ Calabash client và thao tác
với ứng dụng.
Giao tiếp giữa calabash và cucumber
- Công cụ cucumber sẽ thực thi kịch bản test theo từng bước trong file feature
được viết bằng gherkin và tạo ra các kết quả test.
- Cụ thể từng bước của kịch bản test trong các file step definitions được viết
bằng ruby. Calabash clients được sử dụng để mô tả các bước này.
Calabash-ios
Với iOS chúng ta sẽ tạo một bản sao đặc biệt bằng Xcode và liên kết với calabash
framework. Server framework sẽ bắt đầu một http server bên trong ứng dụng này và
nghe yêu cầu từ client library. Các phương thức ruby API được sử dụng để viết các
bước kiểm thử sẽ tạo http request tới server để làm những việc như tìm kiếm thành
phần trong giao diện, thao tác trên chúng.
Calabash-android
- Instrumentation Test Server: là một ứng dụng khác được cài đặt và thực thi trên
thiết bị. Ứng dụng này dựa trên ActivityInstrumentationTestCase2 từ android
SDK. Nó được tạo ra bởi calabash framework. Chúng ta sẽ thao tác với nó thay
vì thao tác trực tiếp với app.
- Lợi ích lớn nhất của kiến trúc này là bạn có thể kiểm thử ứng dụng Android mà
không cần thay đổi bất kì cái gì trong ứng dụng.
- Các từ khóa của Gherkin có thể viết bằng nhiều ngôn ngữ: hiện tại là 37 ngôn
ngữ bao gồm cả tiếng việt.
Cách viết feature
- Dòng đầu tiên bắt đầu bằng từ khóa Feature, theo sau đó là các dòng mô tả
feature
- Mỗi feature có thể chứa một hay nhiều scenario: bắt đầu bằng từ khóa
Scenario, sau từ khóa Scenario là dòng mô tả kịch bản test
- Ngoài kịch bản, feature có thể chứa:
• Background: thêm một số bối cảnh vào các kịch bản, chạy trước mỗi
kịch bản
• Scenario Outline và Example: tạo ra một kịch bản mẫu để chạy với
nhiều bộ input khác nhau
- Mỗi scenario chứa nhiều step bắt đầu bởi các từ khóa Given, When, Then, But
hoặc And. Cucumber không có sự phân biệt giữa các từ khóa này. Nhưng
chúng ta rất nên sử dụng chúng đúng cách.
o Given: đưa hệ thống vào một trạng thái trước khi người sử dụng bắt đầu
tương tác với hệ thống (trong các bước When). Như trên hình là trạng
thái chỉ còn 1 lon caffee trong máy, và tôi đã nhét và máy 1$.
o When: mô tả các hành động chính người dùng thực hiện như là touch
button, scroll, Trên hình là tôi đã thực hiện hành động là ấn vào nút
chọn caffee.
- Then: quan sát kết quả - các quan sát liên quan đến giá trị kinh doanh, lợi ích
trong mô tả tính năng, như là các giao diện người dùng, tin nhắn, không phải là
một cái gì đó ẩn và không có giá trị kinh doanh. Như ví dụ kết quả mong muốn
là tôi nên được phục vụ một lon caffee.
- But và And: dùng để nối các step thay cho việc lặp lại các từ khóa – làm cho
các step đọc trôi chảy hơn.
Định nghĩa các bước trong kịch bản test
- Mỗi bước (step) sẽ tương ứng với một định nghĩa bước (step definition).
- Mỗi định nghĩa bước bao gồm một từ khóa, một chuỗi hoặc biểu thức chính
- Lợi ích: trừu tượng hóa và tái sử dụng.
Ví dụ ta có một màn hình Talkscreen được trừu tượng hoá thành một trang đối tượng
là một class như sau:
Ở đây ta có phương thức talks() trả về các cuộc nói chuyện đang diễn ra, phương thức
details(talk) để theo dõi chi tiết của một cuộc nào chuyện bất kỳ. Dường như giao diện
của lớp TalksScreen thích hợp cho cả 2 nền tảng iOS và Android. Điều đó nghĩ là
đoạn mã được gọi, thường ở trong định nghĩa các bước, là độc lập với nền tảng, do đó
nó có thể được tái sử dụng qua các nền tảng.
Làm như thế giúp bạn tái sử dụng hoàn toàn tính năng Cucumber cũng như khi cài
đặt: các chi tiết của việc tương tác với màn hình được thực thi bởi trang đối tượng.
Ý tưởng ở đây là bạn cung cấp cài đặt của các trang đối tượng cho mỗi nền tảng bạn
muốn cung cấp (iPhone, iPad, điện thoại Android, máy tính bảng Android, web trên di
động, web cho máy bàn…).
Cách viết test kiểm thử đa nền tảng
Để viết test đa nền tảng với Calabash, ta thực hiện lần lượt các bước sau:
1. Cho mỗi màn hình bạn muốn kiểm thử, chọn một giao diện cho một lớp trang-
đối tượng (giống như lớp TalksScreen ở trên).
2. Trong mỗi định nghĩa bước, chỉ sử dụng các trang đối tượng và phương thức
của chúng (không trực tiếp gọi các hàm API của Calabash iOS hay Calabash
Android).
3. Với mỗi nền tảng có hỗ trợ, đặt một lớp chứa các thực thi các phương thức của
trang-đối tượng.
4. Tạo một hồ sơ Cucumber (config/cucumber.yml). Định nghĩa một hồ sơ cho
mỗi nền tảng (android, ios), chắc chắn mỗi hồ sơ chỉ tải các lớp trang-đối tượng
của nền tảng đó.
Tổng kết kiến trúc kiểm thử đa nền tảng
II. Cruisecontrolrb
1. Tích hợp liên tục (Continuous Integration).
Tích hợp liên tục là gì?
Continuous Integration (CI), hay “tích hợp liên tục” là một trong những Agile
Có thể là do bạn sơ ý add thiếu một vài file vào Source Code Management của
mình, hay thay đổi một vài config, cấu trúc database … mà không thông báo
với người khác .v.v.v
- Chỉ những code mà đảm bảo cho bản build thành công mới đực phép xuất hiện
trong nhánh chính (mainline).
Để giải quyết những vấn đề này, người ta sử dụng một server trung gian đứng ra thực
hiện các bản build mỗi khi có yêu cầu tích hợp. Nó được gọi là CI Server. CI server có
các nhiệm vụ chính sau:
- Quản lí kho lưu trữ mã nguồn
- Kiểm tra và đưa tài nguyên từ kho lưu trữ mã nguồn vào trong quy trình tích
hợp.
- Xây dựng mã nguồn và chạy các kiểm thử.
- Thông báo cho các lập trình viên trong nhóm.
Một số CI server thông dụng: CruiseControlrb, CruiseControl.NET, Jenkins,
Giải pháp này thực sự giúp cho các nhà phát triển phần mềm giảm bớt các vấn đề phát
sinh trong quá trình tích hợp và cho phép công việc phát triển phần trở nên mềm
nhanh chóng và gắn kết hơn.
CI bao hàm một loạt những quá trình được gắn kết với nhau như: tự động build, kiểm
tra tiêu chuẩn mã, phân tích tĩnh, kiểm thử đơn vị, triển khai, kiểm thử tích hợp,
Các yêu cầu của một hệ thống tích hợp liên tục
- Một Source Control Management: SVN, Mercurial, Git, Visual Source Safe…
- Một hệ thống build tự động: Xcode, Ant, .NET, NAnt,
- Khả năng tự kiểm thử trên bản build tự động đó: JUnit,Cucumber , CppUnit …
- Code phải được chuyển lên nhánh chính (mainline) hàng ngày.
- Một CI server có thể gắn kết các công việc trên: Jenkins, Bamboo, Cruisecontrol,
Hudson,
- Khả năng kiểm thử sản phẩm trong môi trường đồng nhất.
- Khả năng báo cáo tình trạng bản build.
- Khả năng triển khai tự động bản build.
- Mọi người có thể nhìn thấy những gì đã xảy ra (thay đổi, lỗi…)để xem xét và giải
không phải chờ đợi cho đến khi chúng trở nên lớn và khó sửa chữa. Họ cũng có thể
đáp ứng tốt hơn yêu cầu đưa thêm tính năng mới vào sản phẩm trong lúc đang phát
triển. Điều này tạo ra một sản phẩm tốt hơn cho khách hàng, đó là hứa hẹn thực sự của
sự linh hoạt.
2. CruiseControlrb
Tổng quan Cruisecontrolrb
CruiseControlrb là một công cụ tích hợp liên tục miễn phí, mã nguồn mở được viết
bằng ruby. Cung cấp môi trường tích hợp liên tục cho bất kì ngôn ngữ lập trình cũng
như bất kì nền tảng nào. Dễ dàng cài đặt, cấu hình và sử dụng.
- Có thể làm việc với Java Ant, .NET, NAnt hay bất kì công cụ xây dựng nào có
thể build bằng dòng lệnh và trả về một giá trị khác 0 nếu xây dựng lỗi.
- Có ứng dụng web dashboard: thuận tiện, hữu ích, trực quan.
- Mở rộng thông qua các builder plugin, tùy chỉnh tiến trình xây dựng và các tùy
chỉnh cấu hình khác.
- Khi quá trình xây dựng bị gián đoạn hoặc đã được sửa, sẽ thông báo cho người
dung qua email, tin nhắn.
- Hỗ trợ các công cụ source control management phổ biến: Subversion, Git,
Mercurial, Bazaar.
- Dễ dàng cài đặt, cấu hình đơn giản và dễ sử dụng.
- Đa nền tảng
Là một CI Server, Cruisecontrolrb làm những công việc sau:
- Quản lí kho lưu trữ mã nguồn
- Kiểm tra và đưa tài nguyên từ kho lưu trữ mã nguồn vào trong quy trình tích
hợp
- Xây dựng mã nguồn và chạy các kiểm thử
- Thông báo cho các lập trình viên trong nhóm
CruiseControlrb bao gồm 2 phần: builder và dashboard
Builder là một tiến trình nền làm nhiệm vụ thăm dò kho quản lý mã nguồn của bạn
(repository) mỗi khoảng thời gian định trước để xem có sửa đổi nào không.
Nếu có ai đó cập nhật công việc của mình lên repository, builder sẽ:
Đối với Mac vào />Và làm theo hướng dẫn
5. Calabash
Cài đặt Calabash-android: />android/blob/master/documentation/installation.md
Để có thể sử dụng calabash với một project android, vào thư mục chính của
project gõ lệnh: calabash-android gen
Để test một app bằng Calabash, trong thư mục của project gõ lệnh
Calabash-android run file.apk
Cài đặt Calabash-iOS
cd vào thư mục cuả project
gõ lệnh: gem install calabash-cucumber
calabash-ios setup
calabash-ios gen để tạo bộ khung features để test
Trong Xcode, build project sử dụng –cal scheme
Sau khi viết xong kịch bản test, vào thư mục project gõ lệnh cucumber để
chạy test
2. Cruisecontrolrb
Download và cài đặt
Download Cruisecontrolrb tại
/>
Sau khi download về, giải nén ra ta được thư mục `cruisecontrol.rb-master`
Gõ lệnh:
cd cruisecontrol.rb-master
./cruise start
để khởi động CruiseControl.
Mặc định CruiseControl sẽ khởi động ở localhost với port 3333
Bạn mở trình duyệt lên và truy cập vào địa chỉ `http://localhost:3333/` Nếu hiện lên
trang giao diện của CruiseControl là bạn đã thành công.
Để đưa một project vào trong quy trình Continuous Integration của CruiseControl ta
gõ lệnh:
`cruise add [project-name] -r [repository] -s [svn|git|hg|bzr]`
trên project cũng như kết quả build và test.
Config để chạy lệnh build và test tự động với app Android và iOS
Trong thư mục của project bạn tạo một file .sh nếu là MacOS, file .bat nếu là
Window, ví dụ `buildtest.sh`, `buildtest.bat`. Ngay khi bạn muốn đưa project vào
quy trình CI hãy tạo file này.
Nếu đó là app Android thì nội dung của nó sẽ như sau:
ant debug
calabash-android run ./bin/YourProject-debug.apk
Dòng đầu tiên là lệnh build bằng ant phiên bản debug.
Dòng thứ hai là lệnh chạy test với Calabash-android.
Nếu đó là app iOS thì nội dung của nó sẽ như sau:
xcodebuild build ONLY_ACTIVE_ARCH=NO -project YourProject.xcodeproj –
scheme YourProject-cal -configuration Debug -sdk iphonesimulator6.1
DEPLOYMENT_LOCATION=YES DSTROOT=build
TARGETED_DEVICE_FAMILY=1
cucumber
Dòng thứ nhất chứa lệnh build bằng XCode.
Dòng thứ hai chứa lệnh chạy test với Cucumber.
Sau đó hãy push file này lên git, CruiseControl sẽ phát hiện có thay đổi và sẽ pull về
để build, nhưng vì chưa được config nên vẫn sẽ báo lỗi
Vào thư mục `\Users\YourName\.cruise\projects\YourProject` mở
file `cruise_config.rb` chỉnh lại dòng:
project.build_command = 'sh buildtest.sh'
đối với MacOS
hoặc
project.build_command = 'buildtest.bat'
đối với Window.
Trong đó `buildtest.sh`, `buildtest.bat` là file bạn đã tạo trong project ở trên.
Lưu lại thay đổi, CruiseControl sẽ phát hiện thay đổi trong file `cruise_config.rb` và
/> />