In the world of automation testing, generating realistic-looking test data is a preferred approach to using static fixtures.
FakerMaker is a Ruby gem that allows you to do just that; using factories to create the test data you need. It can be used with Faker to dynamically generate test data.
Initialisation
We can use Faker and FakerMaker to create a factory for an API request body like this:
require 'faker'
require 'faker_maker'
FakerMaker.factory :example_request, naming: :json do
name { Faker::Name.name }
building_number { Faker::Address.building_number }
street_name { Faker::Address.street_name }
city { Faker::Address.city }
country { Faker::Address.country }
end
Which can be called to create a request body like this:
body = FM[:example_request].build.as_json
=> {"name"=>"The Hon. Earleen Wunsch",
"buildingNumber"=>"148",
"streetName"=>"Mueller Lodge",
"city"=>"Port Darin",
"country"=>"Canada"}
Often when testing we need to use specific values in the test data, however.
An example: we need to send a API request with “city” set to “London” and “country” set to “United Kingdom”.
Inefficient overwriting
This can be done in 4 steps by:
- Initialising a template request:
body = FM[:example_request].build.as_json
=> {"name"=>"Eleni Daniel",
"buildingNumber"=>"50962",
"streetName"=>"Jacqulyn Lights",
"city"=>"New Rubin",
"country"=>"Isle of Man"}
- Overwriting the value of “city” in the request:
body["city"] = "London"
- Overwriting the value of “country” in the request:
body["country"] = "United Kingom"
- Sending a request containing the overwritten body:
body
=> {"name"=>"Eleni Daniel",
"buildingNumber"=>"50962",
"streetName"=>"Jacqulyn Lights",
"city"=>"London",
"country"=>"United Kingdom"}
Though this works, it can be considered “more expensive” than needed, as today I learned from a colleague a simple trick to do this more efficiently in just 2 steps…
Efficient initialising
- Initialising the request with the values we need for the relevant parameter:
body =
FM[:example_request].build(city: "London", country: "United Kingdom").as_json
- Sending a request containing the efficiently initialised body:
body
=> {"name"=>"Msgr. Ernesto Reynolds",
"buildingNumber"=>"942",
"streetName"=>"Goyette Passage",
"city"=>"London",
"country"=>"United Kingdom"}
Job done. Initialising our test data was done more efficiently in a single line of code.
In the context of large automation test packs dealing with complex data, this simple trick can be particularly beneficial to improving efficiency.