The Art of Runnable Specification
The thing is NOBODY reads the fucking paperwork afterwards
Let's not even talk about maintaining it
Test Automation you'll actually like
Simple. Collaborative. Adaptable.
Terminology
Specification
# Specification name
Specification name
==================
Or
Describes a feature
Scenario
Scenario name
-------------
## Scenario name
Or
Describes a acceptance criteria
Tags
Specification Level
===================
Tags: login, admin
Scenario Level
--------------
Tags: login-success, admin
Used to group runnable documentation
Concept
Concept Heading
===============
# Concept Heading
Or
Our reusable documentation
Steps
* Step Name
Our core elements
Parameters
* Check "product" exists
* Check <product> exists
<Dynamic Arg>
Steps arguments
"Static Arg"
* Step that takes a table
| id | name |
|-----|---------|
| 123 | John |
| 456 | Mcclain |
|Table Parameter|
Special Parameters
<prefix:value>
* Check if <file:/work/content.txt> is visible
file
Used as:
* Check if the users exist <table:/Users/john/work/users.csv>
table
Comments
Im a comment!!!
Comment has no syntax. Any normal line of text is treated as comment.
Markdown
Java
C#
Example
Markdown
Specification Heading
=====================
This is an executable specification file. This file follows markdown syntax.
Every heading in this file denotes a scenario. Every bulleted point denotes a step.
To execute this specification, run
gauge specs
* Vowels in English language are "aeiou".
Vowel counts in single word
---------------------------
tags: single word
* The word "gauge" has "3" vowels.
Vowel counts in multiple word
-----------------------------
This is the second scenario in this specification
Here's a step that takes a table
* Almost all words have vowels
|Word |Vowel Count|
|------|-----------|
|Gauge |3 |
|Mingle|2 |
|Snap |1 |
|GoCD |1 |
|Rhythm|0 |
Java
public class StepImplementation {
private HashSet<Character> vowels;
@Step("Vowels in English language are <vowelString>.")
public void setLanguageVowels(String vowelString) {
vowels = new HashSet<>();
for (char ch : vowelString.toCharArray()) {
vowels.add(ch);
}
}
@Step("The word <word> has <expectedCount> vowels.")
public void verifyVowelsCountInWord(String word, int expectedCount) {
int actualCount = countVowels(word);
assertEquals(expectedCount, actualCount);
}
@Step("Almost all words have vowels <wordsTable>")
public void verifyVowelsCountInMultipleWords(Table wordsTable) {
for (TableRow row : wordsTable.getTableRows()) {
String word = row.getCell("Word");
int expectedCount = Integer.parseInt(row.getCell("Vowel Count"));
int actualCount = countVowels(word);
assertEquals(expectedCount, actualCount);
}
}
}
What we get
We'll do it live
Just Code It
Thanks!
The Art of Runnable Specification
By Boaz Berman
The Art of Runnable Specification
Why runnable specifications frameworks will be the next big thing. Gauge as an example.
- 209