You are on page 1of 8

Test Automation: Akamai AGH Lab 

Maciej Gawinecki 
 
Guidelines for lab instructor. 

Requirements 
 

Server and clients in the same subnetwork, with access to external network 

Server: 

Ruby 2.3.0, 

gems: sinatra, rest­client, sqlite3, json 

Application downloaded from: 
https://github.com/dzieciou/agh­akamai­lab­apps 

 

Client: 

JDK 1.7+ 

IDE (Eclipse, Intellij) 

Maven 3.0+ 

Firefox 45.0.1 

Tests downloaded from:​ ​https://github.com/dzieciou/agh­akamai­lab­tests 

Tasks for students  
Task 1: Black box testing of the application 
The goal of the task is to understand how the application works from end­user point of view. 
 
1. Clone the projects if you don’t have done it yet 
 
git clone https://github.com/dzieciou/agh­akamai­lab­tests.git 
git clone https://github.com/dzieciou/agh­akamai­lab­apps.git 
 

1. Start online shop application and bank server: 
 
cd agh­akamai­lab­apps 
ruby shop.rb 

ruby bank.rb 
 

1. Open the URL “​http://localhost:8070/shop/summary​” of the online shop application in 
your favourite browser. 
2. Experiment with the application. Try to find in the bank.rb valid credit card information 
 
 Hint: 
Credit card number  4012888888881881 
Credit card owner  MACIEK 
Credit card CSC  757 
 

Task 2: Automating GUI tests 
The goal of the task is to understand how to automate simple GUI tests for the application. 
This will be a system test which means it will test the whole system. 
 
Launch the “happy path” test that sends valid credit card info and expect a successful 
transaction: 
 
cd agh­akamai­lab­tests 
mvn clean test ­Dtest=com.akamai.testing.aghlab.gui.PositiveGUITest 
 

The script is implementation of the following test scenario: 
Test scenario 
Given​ correct credit card info 
When​ I click Order! button 
Then​ shop accepts the order 
 
This implementation is a raw version meant to go straight to the point, we normally create 
page classes that model the elements and interactions of the websites and we call them 
"page objects". 
 
Implement the following “negative test”: 
Test scenario to automate 
Given​ incorrect credit card info 
When​ I click Order! button 
Then​ shop rejects the order 
 

 

Task 3: Testing shop backend with curl 
curl is a command line tool for performing HTTP requests. It’s available on all Unix and 
MacOs systems. The goal of this task is to understand how curl program can help in 
repeating HTTP requests sent or received by the application quickly. 
 
GUI is talking to the shop backend through HTTP requests. We will sniff this traffic with 
Chrome web browser: 
 
1. Open the Online Shop app:  “​http://localhost:8070/shop/summary​” . Open: Tools > 
More Tools > Developer Tools > Network panel. 
2. Enter valid credit card information and click “Order!” button. 
3. In the Network panel you will see POST​ /shop/order​ request. 
 

 
 

 
1. Right click on the request > Copy as cURL. You should expect 
 
curl 'http://localhost:8070/shop/order ­H 'Origin: 
http://localhost:8070' ­H 'Accept­Encoding: gzip, deflate' ­H 
'Accept­Language: en­US,en;q=0.8,it;q=0.6,pl;q=0.4' ­H 
'Upgrade­Insecure­Requests: 1' ­H 'User­Agent: Mozilla/5.0 
(Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like 
Gecko) Chrome/48.0.2564.116 Safari/537.36' ­H 'Content­Type: 
application/x­www­form­urlencoded' ­H 'Accept: 
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;
q=0.8' ­H 'Cache­Control: max­age=0' ­H 'Referer: 
http://localhost:8070/shop/summary ­H 'Connection: keep­alive' ­­data 
'target_account_iban=9484984948948498&product_id=002&cc_number=401288
8888881881&cc_owner=MACIEK&cc_csc=757' ­­compressed 
 
 

2. Add ​­v ​option to see HTTP request sent and HTTP response received by a curl 
command. 
3. Check credit card balance before and after transaction: 
 
  ​curl http://localhost:8090/bank/cards/4012888888881881/balance 
 
4. Check shop account balance before and after transaction: 
 
  ​curl http://localhost:8090/bank/accounts/4567/balance 
 
Try to break the shop’s backend by changing different parameters of the curl command. 
 
Test scenario 
Given​ I provide my account instead of company account 
When​ I click Pay! button 
Then ​The money from my card are transferred to the given account and not the company 
account. 
 

Task 4: Testing shop backend with REST­Assured 
The goal of this task is automate not only sending a request and verifying the output of shop 
API. 

 
Launch the “happy path” test that sends valid credit card info and expect successful 
transaction: 
 
cd agh­lab­tests 
mvn clean test 
­Dtest=com.akamai.testing.aghlab.rest.PositiveShopBackendTest 
 

The test implements the following scenario. 
Test scenario 
Given​ correct credit card info and existing product id 
When​ I send request to ​/shop/order​ REST API 
Then​ shop accepts the order (HTTP response status 200) 
 
Input data should be validated both on the frontend and backend. To make sure this rule if 
fully respected, Implement the following scenario: 
Test scenario 
Given​ id of product that does not exists 
When​ I send request to ​/shop/order​ REST API 
Then​ shop rejects the order (HTTP response status 400) 
Does it pass? 

Task 5: Testing bank REST API with REST­Assured 
The online shop application talks to the bank REST API to authorize credit card transaction. 
 

The goal of this task is to test bank REST API without using shop application. This will be an 
integration test, not system a system test. 
 
We will need to learn the contract for bank REST API: 

how requests for bank REST API looks like and 

what we should expect in the responses. 

There are two ways for that: by observing actual HTTP traffic and another by checking bank 
REST API definition. 
 
To enable HTTP traffic logging in the log of shop.rb to the following. Stop shop.rb server 
instance (Ctrl+C). Enable logging: 
 
export RESTCLIENT_LOG=stdout 
 

Start shop.rb again 
 
 ruby shop.rb 
 

When you open shop application in your browser and order a product then you will see the 
following entry in console logs: 
 
RestClient.post "http://localhost:8090/bank/pay", 
"cc_number=4012888888881881&cc_csc=757&cc_owner=MACIEK&amount=600&target_ac

count_iban=9484984948948498", "Accept"=>"application/json", 
"Accept­Encoding"=>"gzip, deflate", "Content­Length"=>"101", 
"Content­Type"=>"application/x­www­form­urlencoded" 
# => 200 OK | text/html 0 bytes 
 

To see bank REST API contract open ​bank.rb​ file. 
 
post ​'/bank/pay' ​do 
 ​cc_number ​= params[​:cc_number​] 
 ​cc_csc ​= params[​:cc_csc​] 

 ​cc_owner ​= params[​:cc_owner​] 
 ​amount ​= params[​:amount​] 

 ​target_account_iban ​= params[​:target_account_iban​] 
 

 ​if ​is_card_valid(​cc_number​, ​cc_csc​, ​cc_owner​) 

   transfer_money(amount, cc_number, target_account_iban) 
   ​status ​200 
 ​else 

   ​status ​401 
 ​end 
end 
 
 

Launch the “happy path” test that sends valid credit card info and expect successful 
transaction: 
 
mvn clean test 
­Dtest=com.akamai.testing.aghlab.rest.PositiveBankBackendTest 
 

The test implements the following scenario 
Test scenario 
Given  
● correct credit card info and  
● initial balance on credit card is updated properly and 
● shop account balance is updated properly 
When​ I send request to ​/bank/pay​ REST API 
Then​ the bank accepts the transaction (HTTP response status 200) and accoun 
 
Implement negative scenario. 
Test scenario 
Given​ incorrect credit card info 

When​ I send request to ​/bank/pay​ REST API 
Then​ the bank rejects the transaction (HTTP response status 401) 
Try different types of incorrect data: invalid number, letters instead of numbers, etc. 

Task 6: Mocking bank REST API with ServerMock 
The goal of this task is to learn how to test shop application when the bank REST API is not 
available or simulating some behaviours of the bank REST API are too hard. 
 
Launch the “negative” test that expects shop to respond with Transaction Rejected screen if 
bank responds negatively : 
 
mvn clean test 
­Dtest=com.akamai.testing.aghlab.rest.NegativeTestWithMockedBank 
 

Test scenario 
Given​ bank rejects all transactions with HTTP response status 401 
When​ I submit valid credit card data and existing product id 
Then​ shop rejects the order (HTTP response status 401) 
 
Check how the shop reacts when bank has internal system error: 
Test scenario 
Given​ bank fails to perform any request and returns HTTP response status 500 
When​ I submit valid credit card data and existing product id 
Then​ shop rejects the order (HTTP response status 401)