Some of the important lessons in writing automated checks are found, not in the actual implementation of the check itself, but rather in the specification. What does a green check mean? What are we really trying to find out when we’re running this check? Will somebody from another team understand why this test was written? Does this check say what’s necessary in a feature or does the check only state a procedure without context? Too often we concentrate on syntax, frameworks, and required steps in building automation, but not so much on clearly expressing what’s being checked and why the check is recorded in the first place. I’ve made that mistake and now I am trying to learn how to write better checks.
Take, for example, the cucumber checks below. Would you say that it is clear what’s being verified in the test? What would a product owner probably say about these checks when they see them for the first time?
Scenario Outline: Validating the Rate Plan Policies
Given I am in the ShowRoomsPage for a "<hotel_type>" property from "<arrival>" to "<departure>" for a "<rateplan>" rate plan for a "confirmed" reservation
When I view the policies for the rate plan
Then I know that these are the correct policies
| hotel_type | arrival | departure | rateplan |
| DWH | 4 DAYS FROM NOW | 6 DAYS FROM NOW | Public_Partial_LT |
| DWH | TOMORROW | 3 DAYS FROM NOW | Public_Full_YesR_LT |
Some of the questions that would probably pop up in their minds include the following: How are the examples in the grid necessary for the test? What does Public_Partial_LT or Public_Full_YesR_LT mean? Do we really need to know the arrival and departure date settings for the checks? What does the Given statement mean? Most importantly, how do I know that the policies are actually correct for these tests?
This was how I wrote my checks before when I started studying how to write Cucumber-Watir-Ruby checks. And a lot of my checks in the existing test suite still are. I am, however, trying to learn how to re-write them in a better way, in terms of readability and conciseness, guided by lessons so far learned from Jeff Nyman’s test description language blog posts, so that almost everybody in our team can recognize in a glance what a particular check does and why they are included in the feature.
Re-writing the example checks above, I now have these:
Scenario: ShowRooms Prepayment Policy, DWH Partial
When guest views the policies for a DWH property for a partial rate plan
Then a copy of "Only 10% prepayment is required to confirm your reservation" is displayed in the prepayment policy
Scenario: ShowRooms Prepayment Policy, DWH Full Non-Refundable
When guest views the policies for a DWH property for a full nonrefundable rate plan
Then a copy of "Full prepayment is required to confirm your reservation" is displayed in the prepayment policy
Not perfect, but I’d like to think that they are more effective than the ones I had before. Checks are more specific, unrelated information are not included in the test, and we understand what it means when the checks pass or fail.
What do you think?