Featured

Welcome to Red Green Refactor

We officially welcome you to the start of Red Green Refactor, a technology blog about automation and DevOps. We are a group of passionate technologists who care about learning and sharing our knowledge. Information Technology is a huge field and even though we’re a small part of it – we wanted another outlet to collaborate with the community.

Why Red Green Refactor?

Red Green Refactor is a term commonly used in Test Driven Development to support a test first approach to software design. Kent Beck is generally credited with discovering or “rediscovering” the phrase “Test Driven Development”. The mantra for the practice is red-green-refactor, where the colors refer to the status of the test driving the development code.

The Red is writing a small piece of test code without the development code implemented. The test should fail upon execution – a red failure. The Green is writing just enough development code to get the test code to pass. The test should pass upon execution – a green pass. The Refactor is making small improvements to the development code without affecting the behavior. The quality of the code is improved according to team standards, addressing “code smells” (making the code readable, maintainable, removing duplication), or using simple design patterns. The point of the practice is to make the code more robust by catching the mistakes early, with an eye on quality of the code from the beginning. Writing in small batches helps the practitioner think about the design of their program consistently.

“Refactoring is a controlled technique for improving the design of an existing codebase.”

Martin Fowler

The goal of Red Green Refactor is similar to the practice of refactoring: to make small-yet-cumulative positive changes, but instead in learning to help educate the community about automation and DevOps. The act of publishing also encourages our team to refine our materials in preparation for a larger audience. Many of the writers on Red Green Refactor speak at conferences, professional groups, and the occasional webinar. The learning at Red Green Refactor will be bi-directional – to the readers and to the writers.

Who Are We?

The writers on Red Green Refactor come from varied backgrounds but all of us made our way into information technology, some purposefully and some accidentally. Our primary focus was on test automation, which has evolved into DevOps practices as we expanded our scope into operations. Occasionally we will invite external contributors to post on a subject of interest. We have a few invited writers lined up and ready to contribute.

“Automation Team” outing with some of Red-Green-Refactor authors

As for myself, I have a background in Physics & Biophysics, with over a decade spent in research science studying fluorescence spectroscopy and microscopy before joining IT. I’ve worked as a requirements analyst, developer, and tester before joining the ranks of pointed-headed management. That doesn’t stop me from exploring new tech at home though or posting about it on a blog.

What Can You Expect From Red Green Refactor?

Technology

Some companies are in the .NET stack, some are Java shops, but everyone needs some form of automation. The result is many varied implementations of both test & task automation. Our team has supported almost all the application types under the sun (desktop, web, mobile, database, API/services, mainframe, etc.). We’ve also explored with many tools both open-source and commercial at companies with ancient tech and bleeding edge. Our posts will be driven by both prior experience as well as exploration to the unknown.

We’ll be exploring programming languages and tools in the automation space.  Readers can expect to learn about frameworks, cloud solutions, CI/CD, design patterns, code reviews, refactoring, metrics, implementation strategies, performance testing, etc. – it’s open ended.

Continuous Improvement

We aim to keep our readers informed about continuous improvement activities in the community. One of the great things about this field is there is so much to learn and it’s ever-changing. It can be difficult at times with the firehose of information coming at you since there are only so many hours in the day. We tend to divide responsibility among our group to perform “deep dives” into certain topics and then share that knowledge with a wider audience (for example: Docker, Analytics or Robot Process Automation). In the same spirit we plan to share information on Red Green Refactor about continuous improvement. Posts about continuous improvement will include: trainings, conference recaps, professional groups, aggregated articles, podcasts, tech book summaries, career development, and even the occasional job posting.

Once again welcome to Red Green Refactor. Your feedback is always welcome.

Book Club: The DevOps Handbook (Introduction)

This entry is part 1 of 1 in the series DevOps Handbook

The following is a chapter summary for “The DevOps Handbook” by Gene Kim, Jez Humble, John Willis, and Patrick DeBois for an online book club.

The book club is a weekly lunchtime meeting of technology professionals. As a group, the book club selects, reads, and discuss books related to our profession. Participants are uplifted via group discussion of foundational principles & novel innovations. Attendees do not need to read the book to participate.

Background on The DevOps Handbook

More than ever, the effective management of technology is critical for business competitiveness. For decades, technology leaders have struggled to balance agility, reliability, and security. The consequences of failure have never been greater―whether it’s the healthcare.gov debacle, cardholder data breaches, or missing the boat with Big Data in the cloud.

And yet, high performers using DevOps principles, such as Google, Amazon, Facebook, Etsy, and Netflix, are routinely and reliably deploying code into production hundreds, or even thousands, of times per day.

Following in the footsteps of The Phoenix Project, The DevOps Handbook shows leaders how to replicate these incredible outcomes, by showing how to integrate Product Management, Development, QA, IT Operations, and Information Security to elevate your company and win in the marketplace.

The DevOps Handbook

An Introduction to DevOps

“Imagine a world where product owners, Development, QA, IT Operations, and Infosec work together, not only to help each other, but also to ensure that the overall organization succeeds. By working toward a common goal, they enable the fast flow of planned work into production (e.g., performing tens, hundreds, or even thousands of code deploys per day), while achieving world-class stability, reliability, availability, and security.”

An Introduction to DevOps

In this world, cross-functional teams rigorously test their hypotheses of which features will most delight users and advance the organizational goals.

Simultaneously, QA, IT Operations, and Infosec are always working on ways to reduce friction for the team, creating the work systems that enable developers to be more productive and get better outcomes.

This enables organizations to create a safe system of work, where small teams are able to quickly and independently develop, test, and deploy code and value quickly, safely, securely, and reliably to customers.

By adopting Lean principles and practices, manufacturing organizations dramatically improved plant productivity, customer lead times, product quality, and customer satisfaction, enabling them to win in the marketplace.

Before the revolution, average manufacturing plant order lead times were six weeks, with fewer than 70% of orders being shipped on time.

By 2005, with the widespread implementation of Lean practices, average product lead times had dropped to less than three weeks, and more than 95% of orders were being shipped on time.

Adopted from the DevOps Handbook

Most organizations are not able to deploy production changes in minutes or hours, instead requiring weeks or months. These same organizations are not able to deploy hundreds or thousands of changes into production per day. They struggle to deploy monthly or even quarterly. Production deployments are not routine, but instead involve outages and firefighting.

The Core, Chronic Conflict

In almost every IT organization, there is built-in conflict between Development and IT Operations that creates a downward spiral, resulting in slower time to market for new products and features, reduced quality, increased outages, and an ever-increasing amount of technical debt.

Technical Debt: the term “technical debt” was first coined by Ward Cunningham. Technical debt describes how decisions we make lead to problems that get increasingly more difficult to fix over time, continually reducing our available options in the future — even when taken on judiciously, we still incur interest.

Two competing organizational interests: respond to the rapidly changing competitive landscape and provide a stable service to the customer.

Development takes responsibility for responding to changes in the market, deploying features and changes into production. IT Operations takes responsibility for providing customers with IT service that is stable and secure, making it difficult for anyone to introduce production changes that could jeopardize production. Dr. Eli Goldratt called these types of configuration “the core, chronic conflict”.

The Downward Spiral

The first act begins in IT Operations, where our goal is to keep applications and infrastructure running so that our organization can deliver value to customers. In our daily work, many of our problems are due to applications and infrastructure that are complex, poorly documented, and incredibly fragile. The systems most prone to failure are also our most important and are at the epicenter of our most urgent changes.

The second act begins when somebody has to compensate for the latest broken promise—it could be a product manager promising a bigger, bolder feature to dazzle customers with or a business executive setting an even larger revenue target. Then they commit the technology organization to deliver upon this new promise. Development is tasked with another urgent project that inevitably requires solving new technical challenges and cutting corners to meet the promised release date, further adding to our technical debt.

The Third and final act, where everything becomes just a little more difficult, bit by bit—everybody gets a little busier, work takes a little more time, communications become a little slower, and work queues get a little longer. Our work becomes more tightly-coupled, smaller actions cause bigger failures, and we become more fearful and less tolerant of making changes. Work requires more communication, coordination, and approvals; teams must wait longer for their dependent work to get done; and our quality keeps getting worse.

Why Does the Downward Spiral Happen?

Every IT organization has two opposing goals, and second, every company is a technology company, whether they know it or not. The vast majority of capital projects have some reliance upon IT.

“When people are trapped in this downward spiral for years, especially those who are downstream of Development, they often feel stuck in a system that pre-ordains failure and leaves them powerless to change the outcomes. This powerlessness is often followed by burnout, with the associated feelings of fatigue, cynicism, and even hopelessness and despair.”

An Introduction to DevOps

A culture can be created where people are afraid to do the right thing because of fear of punishment, failure, or jeopardizing their livelihood. This can create the condition of learned helplessness, where people become unwilling or unable to act in a way that avoids the same problem in the future.

Counteracting the Downward Spiral

By creating fast feedback loops at every step of the process, everyone can immediately see the effects of their actions. Whenever changes are committed into version control, fast automated tests are run in production-like environments, giving continual assurance that the code and environments operate as designed and are always in a secure and deployable state. Automated testing helps developers discover their mistakes quickly.

High-profile product and feature releases become routine by using dark launch techniques. Long before the launch date, we put all the required code for the feature into production, invisible to everyone except internal employees and small cohorts of real users, allowing us to test and evolve the feature until it achieves the desired business goal.

In a DevOps culture, everyone has ownership of their work regardless of their role in the organization.

The Business Value of DevOps

High-Performing Organizers succeed in the following areas:

  • Throughput metrics
  • Code and change deployments (thirty times more frequent)
  • Code and change deployment lead time (two hundred times faster)
  • Reliability metrics
  • Production deployments (sixty times higher change success rate)
  • Mean time to restore service (168 times faster)
  • Organizational performance metrics
  • Productivity, market share, and profitability goals (two times more likely to exceed)
  • Market capitalization growth (50% higher over three years)

When we increase the number of developers, individual developer productivity often significantly decreases due to communication, integration, and testing overhead. DevOps shows us that when we have the right architecture, the right technical practices, and the right cultural norms, small teams of developers are able to quickly, safely, and independently develop, integrate, test, and deploy changes into production.

Organizations adopting DevOps are able to linearly increase the number of deploys per day as they increase their number of developers

“The purpose of the DevOps Handbook is to provide the theory, principles, and practices needed to successfully start a DevOps initiative. This guidance is based on decades of management theory, study of high-performing technology organizations, work the authors have done helping organizations transform, and research that validates the effectiveness of the prescribed DevOps practices.”

An Introduction to DevOps

The reader is not expected to have extensive knowledge of any of these domains, or of DevOps, Agile, ITIL, Lean, or process improvement. Each of these topics is introduced and explained in the book.

The goal is to create a working knowledge of the critical concepts in each of the above listed areas.

From The Pipeline v23.0

This entry is part 23 of 23 in the series From the Pipeline

The following will be a regular feature where we share articles, podcasts, and webinars of interest from the web.

Microsoft Races Ahead On RPA (Robotic Process Automation)

After Microsoft’s acquisition of Softmotive, it was expected they would make strides in the RPA market. Now rebranded as “Power Automate”, the desktop tool is used for both web- and desktop-applications. Most of the processes are automated via a drag-and-drop mechanism with a library of standard actions to choose from. Like the other big vendors in the space (UiPath, Blue Prism, Automation Anywhere), Microsoft wants to extend their tool to Machine Learning (ML) and Artificial Intelligence (AI) capabilities.

Best Practices for using Docker Hub for CI/CD

Docker has published the first in a series of posts about using Docker Hub for CI/CD. To set the stage, they ask users to consider the inner loop (code, build, run, test) and the outer loop (push change, CI build, CI test, deployment) of the development cycle. For instance, as part of hte inner loop they recommend running unit tests as part of the docker build command by adding a target for them in the Dockerfile. Additionally, when setting up CI they recommend using a Docker Hub access token rather than a password (new access tokens can be created from the security page on Docker Hub). Another recommendation is to reduce the build time and reduce the number of calls by making use of the build cache to reuse layers already pulled using buildX caching functionality. Lots more to come in subsequent posts from the team at Docker.

5 Key Elements for Designing a Successful Dashboard

“When you’re designing a dashboard to track and display metrics, it is important to consider the needs and expectations of the users of the dashboard and the information that is available. There are several aspects to consider when creating a new dashboard in order to make it a useful tool. For a mnemonic device to help you easily remember the qualities that make a good dashboard, just remember the acronym ‘VITAL.'”

BDD (Behavior Driven Development) | Better Executable Specifications

Dave Farley speaks on Behavior Driven Development (BDD) in this video recorded by Continous Delivery. In the talk, he provides background on the creation of BDD and its relation to Test Driven Development (TDD). Dave gives a solid rundown of the naming conventions that should be used and those that should be avoided — with the effects on software testing. This is a great starter for anyone looking to learn more about BDD.

10 Reasons to Attend DevOps Next

DevOps Next is happening this week online (https://www.perfecto.io/devops-next). The conference has three tracks to choose from: Testing Tools, which include an introduction to AI/ML in software testing tools; Continuous Testing, which are practices and use cases in continuous testing leveraging AI and ML; and, DevOps & Code, about maturing code quality and DevOps teams productivity using AI and ML. The event is headlined by a number of experts in the field. A great opportunity to learn more about ML & AI (Note: I will also be presenting on RPA).

From the Pipeline v22.0

This entry is part 22 of 23 in the series From the Pipeline

The following will be a regular feature where we share articles, podcasts, and webinars of interest from the web.

A Primer on Engineering Delivery Metrics

Juan Pablo Buriticá recently published on excellent article on engineering metrics. The focus of the article is learning about what and how to measure the software delivery phase of development. The first step is to define why you want to measure something — look for the outcome. Another key component is building trust in the organization, so the team believes in the strategy. Some of the Software Delivery Performance Metrics to consider: delivery lead time, deployment frequency, mean time to restore, and change failure rate.

How to Start Testing with Python

This webinar led by Andy Knight walks you through the essentials of test automation with Python. He uses pytest as the framework. During the course of the session, he shows how to write unit & integration tests. He also gives a rundown of parameters, fixtures, and plugins.

What Are Machine Learning Uses to Improve Static Analysis

The article demonstrates a few use cases for machine learning in performing static analysis of defects. For one, it can be used to group defects together that are similar in nature. These groupings can be used to look for patterns in system behavior. Another usage is ranking defects based on how straightforward or complex they are; AI-assisted defect ranking uses supervised learning. A similarity score is attached to defect report to either “True Positive Reports” (TP) or “False Positive Reports” (FP). The two groups are based on the results of prior review of the defects reported in the past.

Improving Test Data Collection and Management

“There is much published about the data we generate to assess product quality. There is less discussion about the data testers generate for our own use that can help us improve our work—and even less is said about recommended practices for data collection. Test data collection, management, and use all call for upfront planning and ongoing maintenance. Here’s how testers can improve these practices.”

Book Review: Explore it!

Kristin Jackvony has posted a review of Elizabeth Hendrickson’s “Explore It!” book on exploratory testing. The book should be required reading for anyone in software testing.  The first key delineation; checking is what a tester does when they want to make sure that the software does what it’s supposed to do, whereas exploring is what a tester does when they want to find out what happens if the user or the system doesn’t behave as expected.

From the Pipeline v21.0

This entry is part 21 of 23 in the series From the Pipeline

The following will be a regular feature where we share articles, podcasts, and webinars of interest from the web.

Code Review Checklist

Michaela Greiler has put together a great list of concerns for any code reviewer as a set of best practices. It’s one thing to require others to approve a pull request, it’s quite another to establish a set of standards for the team to enforce during those code reviews. She first provides a quick list of items to self-review before sending out the code for review by others. She also includes a robust list of items broken down by category: implementation, logic errors & bugs, error handling & logging, usability & accessibility, testing & testability, dependencies, security & data privacy, performance, readability, and expert opinion. She finishes with some excellent advice on being respectful in code reviews as a professional courtesy. This is definitely an article to be bookmarked.

Bringing New Life into Edge Selenium Tools

Microsoft Edge has been rebuilt using Chromium, which means a new automation implementation using Selenium. Michael Mintz took Edge through a test drive using Python to check the performance. He found that Edge automation has mostly the same response as Chrome with a few differences in how extensions are handled. Michael used SeleniumBase, a neat wrapper for Selenium, to setup his automation scripts. You can get EdgeDriver directly from Microsoft HERE and SeleniumBase HERE.

Improving Test Data Collection and Management

“There is much published about the data we generate to assess product quality. There is less discussion about the data testers generate for our own use that can help us improve our work—and even less is said about recommended practices for data collection. Test data collection, management, and use all call for upfront planning and ongoing maintenance. Here’s how testers can improve these practices.”

The Problem With “Broken Windows” Policing

This article goes off the path for the typical post on Red Green Refactor, but it’s important historically for context around the term “Broken Windows”, which is often applied to the state of a codebase with too much technical debt. In tech, the advice around broken windows is applied to maintaining good practices such as code reviews, regular refactoring, following design patterns, and implementing extensible architecture. However, the term itself has been misapplied for many years in law enforcement policies. The article is enlightening about the context of terms we use in tech but don’t necessarily know the origin or outside applications of the term.

Tutorial on SRE-Driven Performance Engineering with Neotys and Dynatrace

This is a great instructional video on performance feedback. Andreas Grabner and Henrik Rexed demonstrate how to practice performance engineering using Neotus and Dynatrace. They build a delivery pipeline that automates the tasks around preparing, setting up, and analyzing test executions.

From the Pipeline v20.0

This entry is part 20 of 23 in the series From the Pipeline

The following will be a regular feature where we share articles, podcasts, and webinars of interest from the web.

Cucumber Reports

The creators of Cucumber have released a free, cloud-based service for sharing execution reports for scenarios. Both the Java and Ruby implementations of Cucumber have the report functionality built-in with simple commands or environment variables. If enabled, the console output links to an online execution report. The results will be available for a 24-hour period before being automatically deleted. In the future, the execution reports can be linked to a GitHub repo and will no longer be scheduled for auto-deletion if claimed.

Separating Automation Tooling from Automation Strategy

“When people do not have good luck with automation, it is hardly ever because of the tool being used, but almost always because of the wrong automation strategy, wrong expectations, and wrong adoption of automation. Automation tools only answer the “how” of automation, while having an automation strategy gives answers to who, where, when, what, and why. Here’s why it’s so important to have a test automation strategy.”

Ten More Commandments on Automation

Paul Grizzaffi provides an excellent overview of the common pitfalls organizations run into with test automation. His advice brings the same concepts we would expect from development code and applies is to test automation code because we should treat them the same way. Check to see if any of your test automation code breaks a commandment!

The Technical Debt Quadrant

The article a breakdown of the four types of technical debt as originally described by Martin Fowler. Sometimes we make deliberate mistakes either to simply push the product to production or because we don’t properly consider design. Other times our own inexperience with a technology means we make mistakes. How we react to that accrued technical debt determines if we are reckless or prudent about identifying the problem to help ensure we don’t repeat the mistakes again.

Webinar: Add Static Code Analysis to Your CI/CD Pipelines

Perforce recently hosted a webinar on static code analysis in CI/CD pipelines. Plenty of excellent lessons to learn about adding quality to deployment pipelines. “With the amount of software being installed into devices across all industries, it has become essential that the embedded code is safe and secure, reliable, and high quality. However, ensuring that the embedded code meets these standards and is delivered in a timely manner can be a daunting and time-consuming challenge. For that reason, it is essential that developers pair static code analysis with efficient software development practices, such as CI/CD pipelines. View this webinar and learn how to add static analysis to your DevOps process.”

From the Pipeline v19.0

This entry is part 19 of 23 in the series From the Pipeline

The following will be a regular feature where we share articles, podcasts, and webinars of interest from the web.

Mozilla: The Greatest Tech Company Left Behind

A sad story about layoffs at Mozilla with cuts happening in the developer tools division. The article contains a brief history of Mozilla, including their contributions to web. Mozilla actually pulls most of it’s revenue from Google, a competitor to the browser, to make the search engine the default for the browser. Probably one of their biggest failures is not having a presence in the mobile web market, which is dominated by Chrome and Safari.

Introducing BDD to Your Team: How Does it Affect Your Role as a Tester?

Bas Djikstra provides a roadmap for introducing your team to BDD. The first fundamental mindset change is involving testers from the start of development of every new feature. Bas recommends involving testers in refinements sessions upfront. Specifications should be discussed upfront with the business partners and work with the developers should be collaborative during actual feature development. The last piece of BDD is automating those specifications to align with end-user behavior.

How Continuous Testing is Done in DevOps

“DevOps does speed up your processes and make them more efficient, but companies must focus on quality as well as speed. QA should not live outside the DevOps environment; it should be a fundamental part. If your DevOps ambitions have started with only the development and operations teams, it’s not too late to loop in testing. You must integrate QA into the lifecycle in order to truly achieve DevOps benefits.”

Breakpoint Highlights: Test Automation

BrowserStack’s first virtual conference recorded all their sessions and have made them available to everyone. It’s a good alternative to the face-to-face events many of us have missed since COVID. At least with these virtual events we can watch them at our leisure and not have to worry about choosing between two talks at the same slot. Details: “We hosted BrowserStack’s first-ever virtual summit, Breakpoint 2020 last week. We saw over 10,000 registrations and 2500+ attendees from 155 countries, 18 speakers, and 2 cats! Speakers from Twitter, Trivago, Selenium, Robot Framework, and more talked about agile testing, quality at speed, decentralized testing, release reconstruction, and testing best practices.”

A Guide from Key DevOps Experts

Eran Kinsbruner of Perforce is releasing another anthology book written by a group of DevOps professionals on Artificial Intelligence, Machine Learning, and Robotic Process Automation. The book covers: “The fundamentals of AI and ML in software development and testing, including the basics for testing AI-based applications, classifications of AI/ML, and defects tied to AI/ML. Practical advice and recommendations for using AI/ML-based solutions within software development activities, like visual AI test automation, AI in test management, testing conversational AI apps, RPA benefits, and API testing. More advanced and future-focused angles of AI and ML with projections and unique use cases, including AI and ML in logs observability, AIOps, how to maintain AI/ML test automation, and test impact analysis with AI.”

Book Club: Behavior Driven Development – Discovery (Chapter 5)

This entry is part 5 of 5 in the series BDD Discovery

The following is a chapter summary for “BDD Books – Discovery” by Gaspar Nagy and Seb Rose for an online book club.

The book club is a weekly lunchtime meeting of technology professionals. As a group, the book club selects, reads, and discuss books related to our profession. Participants are uplifted via group discussion of foundational principles & novel innovations. Attendees do not need to read the book to participate.

Background on BDD Discovery

DISCOVERY

“Explore behavior using examples

Written by the creator of SpecFlow and the author of The Cucumber for Java Book, this book provides inside information on how to get the most out of the discovery phase of Behaviour Driven Development (BDD). This practical guide demonstrates good collaboration techniques, illustrated by concrete examples.

This book is written for everyone involved in the specification and delivery of software (including product owners, business analysts, developers, and testers). The book starts by explaining the reasons BDD exists in the first place and describes techniques for getting the most out of collaboration between business and delivery team members.

This is the first in the BDD Books series that will guide you through the entire development process, including specific technical practices needed to successfully drive development using collaboratively-authored specifications and living documentation.”

BDD Discovery

Chapter 5

In this chapter, the author’s share their experiences of how to get business representatives fully involved in the BDD approach and what kind of challenges they might face.

“Collaboration means that team members with different roles work together to deliver working software. A team will include both the business (product owners, project sponsors, business analysts, etc.) and technical personnel (such as developers, testers, UX experts and operation staff).”

Chapter 5 – How to Get Business Involved

5.1 Learn From Your Peers

The key benefits typically attributed to BDD are:

  • Reduced cycle time
  • Reduced rework/rejections
  • Reduced number of production issues
  • Keeping the implementation costs of new features under control
Cucumber is one option for practicing BDD

5.2 The One Where Business is Not Involved

Challenges in getting the business to adopt BDD include:

  • Have a default resistance against new methodologies
  • See this approach as an overhead
  • Be afraid of learning and infrastructure costs
  • Have formal or legal distance from the team (e.g. the business Representative is a part of the customer, not the vendor)
  • See BDD as a testing or a development technique

BDD should not be a developer-only or tester-only activity. Without business, consider the following options: (1) the situation is a temporary step towards full collaboration, (2) envision the scenarios as business examples with the business explaining the story, (3) focus the detailed requirement discussions as examples, and (4) present the results & methods to the business regularly.

“Without the business involved, unless the team is very business-focused and disciplined, the scenarios become technical, data-driven and dry. This removes the possibility that the scenarios will provide a constructive feedback loop between the business and delivery team – so the scenarios become an overhead.”

Chapter 5 – The One Where Business is Not Involved

5.3 BDD is for Solving Problems

BDD has no value unless it is helping solve problems, improve development efficiency, and produce better results. In order to get business engaged, pain points (or opportunities) must be found that exist in the current process.

Product Owner is Overloaded

BDD can help reduce the Product Owner’s workload. BDD improves communication efficiency by focusing on early, direct communication with the business, ensuring fewer misunderstandings and less rework.

BDD product owner activities:

  • Participate in requirement workshops (e.g. Example Mapping)
  • Review the scenarios
  • Give feedback about the implemented application

Comparison to classic product owner activities:

  • Writing specifications
  • Presenting the stories to the team
  • Discussing ad-hoc questions during implementation
  • Collecting deviations from the expected result in the Sprint review
  • Managing and prioritizing requirement-related bugs

Production Issues are Common

Production Issues are not only costly to fix, but can result in customer dissatisfaction and mistrust. BDD helps prevent production issues being introduced during requirement analysis and detailed specification.

The resulting reduction in production issues is the most easily measurable benefit of applying the BDD approach.

Challenge to Get the Product to a Deliverable State

There is and underestimated gap between implementing a feature and bringing it to a releasable state. Side tasks include: creating deployment packages, updating user documentation or verifying performance requirements.

To ensure that the application can be reliably released at short notice, the team should follow the continuous delivery (CD) approach. Continuous Delivery requires a team to work on the product in short cycles, where each cycle contains all the necessary steps to make the application deliverable. A high level of automation is required to perform the necessary verification and packaging steps.

  • NOTE: The process that automatically builds, tests and packages each product increment as a potential deliverable is called continuous delivery. The process that also automatically releases each deliverable to end users is called continuous deployment.

To move towards continuous delivery, stories should be sliced up into very small chunks. Sometimes teams adopt an approach called horizontal slicing, where tasks are defined along the different layers of the application. Vertical slicing is a functional breakdown where each scenario represents a portion of the expected behavior and makes sense on its own.

Customers are Not Engaged with the Product

Customers who do not like or do not use the product often indicate a development process that does not focus on value. BDD encourages the team to focus on realistic examples of application behavior, so the product evolves according to the users’ viewpoint.

The collaboration techniques used by BDD can help UX expert involvement earlier.

Deadlines are Often Missed

Deadlines are set based upon an estimate of how long to deliver the set of required features (the scope), which can be missed. The key to the successful management of deadlines is to allow more flexibility in the scope: “Try to implement as much value as we can for the given deadline.”

BDD will not tell you how to cut the scope, but it does provide a framework for enabling functional cuts, even within a user story. Scenarios provide a functional breakdown of the story, and allow the reduction of scope by identifying and deferring lower priority behaviors.

Difficult to Get an Overview of Progress

Having a good overview of progress is essential to good project management. Delivered scenarios are an excellent indicator of progress.

The traditional approach of calculating an arbitrary percentage of work completed is not as effective.

Introduction of New Features Causes Side-Effects

The success of a great new feature in the application can easily be overshadowed by a bug that gets introduced at the same time. As the code-base grows the chance of a change producing unwanted side-effects increases.

Adopting BDD encourages good automated test coverage, where automated tests and scenarios are tightly connected to the requirements.

Once a change causes a failing test, it is easy to diagnose whether this problem is related to contradictory requirements or defects in the code. Automation test coverage acts as a safety net.

Not Being Able to Quickly React to Market Changes

In order match competitors in a changing market, the product development model must keep the cost of implementing new features low, while maintaining the quality of the application.

Experiments are valuable at the code-level and specification-level. The behavior framework for the product can be used by the product owner or the business analyst to investigate how the system behaves with different parameters or different user workflows.

Bug versus Feature Debate

Developers and testers build up their own solutions independently: the developers write the application code and the testers write the test cases. The redundancy might result in conflicts at the point when the two parallel worlds meet: when the test cases are used to test the application.

The rework and frustration can be avoided by reducing developers and testers to work on understanding the details of the requirements together.

Changes Regularly Requested at Sprint or Feature Reviews

The iterative development concept of agile is based on the fact that feedback for a feature occurs when business stakeholders actually see it demonstrated. If changes are discovered regularly during the review, then the details in the requirements are not being described properly.

BDD supports the detailed requirement analysis in many ways:

  • By focusing on examples, ambiguities can be recognized and cleared up
  • Since scenarios document the specification in a common language, misunderstandings are less likely to occur.

Product Owner Never Reads the Scenarios

A common situation is a product owner that never reads the scenarios. Scenarios specify how the application should behave. Confirm the Product Owner has access to the living documentation, whether it be stored in source control or a project tracking tool.

Integrate the publishing process into the continuous integration pipeline and make the result easily accessible (by adding a link to the project dashboard, for example). Improve how scenarios are tagged. Take time to regularly reflect on how the living documentation is being used by the business and what changes might make it more useful.

5.4 What We Just Learned

BDD depends on collaboration. Getting the business involved is key to success. The authors presented some tips based on experience to adopting BDD within organizations. There are two follow-up books to BDD Discovery: Formulation and Automation.

Outside Resources for Further Reading

Books:

  • Adzic, Gojko. Specification by Example: How Successful Teams Deliver the Right Software. Shelter Island, NY: Manning, 2011.
  • Nagy, Gáspár, and Seb Rose. The BDD Books: Formulation. In preparation. http://bddbooks.com/formulation.
  • Nagy, Gáspár, and Seb Rose. The BDD Books: Automation with SpecFlow. In preparation. http://bddbooks.com/specflow.
  • Adzic, Gojko. Bridging the Communication Gap: Specification by Example and Agile Acceptance Testing. London: Neuri, 2009.
  • Wynne, Matt, and Aslak Hellesøy. The Cucumber Book: Behaviour-driven Development for Testers and Developers. Dallas, TX: Pragmatic Bookshelf, 2012.
  • Freeman, Steve, and Nat Pryce. Growing Object-oriented Software Guided by Tests. S.l.: Addison-Wesley Professional, 2009.
  • Crispin, Lisa, and Janet Gregory. Agile Testing: A Practical Guide for Testers and Agile Teams. Upper Saddle River, NJ: Addison-Wesley, 2009.
  • Hendrickson, Elisabeth, Ward Cunningham, and Jacquelyn Carter. Explore It! Reduce Risk and Increase Confidence with Exploratory Testing. Dallas: Pragmatic Bookshelf, 2013.
  • Kniberg, Henrik, Mattias Skarin, Mary Poppendieck, and David Anderson. Kanban and Scrum: Making the Most of Both. United States: InfoQ, 2010. Print/Web. https://www.infoq.com/minibooks/kanban-scrum-minibook.

Publications:

  • J.-C. Chen and S.-J. Huang, “An empirical analysis of the impact of software development problem factors on software maintainability,” Journal of Systems and Software, vol. 82, pp. 981-992 June 2009. Dallas: Pragmatic Bookshelf, 2013.

Online:

Book Glossary

Behavior Driven Development (BDD) is an agile approach to delivering software.

Continuous Delivery requires a team to work on the product in short cycles, where each cycle contains all the necessary steps to make the application deliverable. A high level of automation is required to perform the necessary verification and packaging steps.

Continuous Deployment is the process that automatically releases each deliverable to end users.

Example:

  • Context: describes the state of the system before the action takes place.
  • Action: the event that causes the behavior to take place. It might be some action by a user, the system, a scheduled job, or any other stimulus that can cause the system to react.
  • Outcome: description of the state of the system after the user or system behavior has taken place. It should contain enough detail to measure the behavior against expectations.

Horizontal Slicing are tasks or user stories defined along the different layers of the application.

Living Documentation is a form of documentation that represents the current state of the application, which is updated in real-time.

Kanban optimizes end-to-end delivery (“lead time”) by visualizing the workflow and limiting work in progress (WIP) to be able to detect and fix bottlenecks more easily.

Persona in user-centered design and marketing is a fictional character created to represent a user type that might use a site, brand, or product in a similar way.

Requirement Workshop is an activity where the team meets regularly, the purpose is to explore a user story, the scope of the story is discussed, the story is illustrated with examples, and questions are documented that no one in the workshop can answer.

Structured Conversation is a facilitated exchange of ideas that conform to a predefined form.

Test-Driven Development (TDD) helps speed up the feedback loop by demanding that teams write automated tests before they write the code.

Vertical Slicing is a functional breakdown where each scenario represents a portion of the expected behavior and makes sense on its own.

Book Club: Behavior Driven Development – Discovery (Chapter 4)

This entry is part 4 of 5 in the series BDD Discovery

The following is a chapter summary for “BDD Books – Discovery” by Gaspar Nagy and Seb Rose for an online book club.

The book club is a weekly lunchtime meeting of technology professionals. As a group, the book club selects, reads, and discuss books related to our profession. Participants are uplifted via group discussion of foundational principles & novel innovations. Attendees do not need to read the book to participate.

Background on BDD Discovery

DISCOVERY

“Explore behavior using examples

Written by the creator of SpecFlow and the author of The Cucumber for Java Book, this book provides inside information on how to get the most out of the discovery phase of Behaviour Driven Development (BDD). This practical guide demonstrates good collaboration techniques, illustrated by concrete examples.

This book is written for everyone involved in the specification and delivery of software (including product owners, business analysts, developers, and testers). The book starts by explaining the reasons BDD exists in the first place and describes techniques for getting the most out of collaboration between business and delivery team members.

This is the first in the BDD Books series that will guide you through the entire development process, including specific technical practices needed to successfully drive development using collaboratively-authored specifications and living documentation.”

BDD Discovery

Chapter 4

The prior chapters emphasized the importance of collaboration for BDD to be successful. This chapter demonstrates how BDD can be integrated into the Software Development Lifecycle (SDLC) by describing the approach in more detail. The chapter will answer the following questions:

  • “Who should write the scenarios?”
  • “Who do we need to participate in the requirement workshops?”
  • “Should the testers or the developers automate the scenarios?”

4.1 The BDD Approach

Figure 21 is a simplified approach of BDD. In practice, BDD is more complex and requires several connected activities to be successful.

For each step in the process, please refer to Figure 22.

#1 Pick a User Story

  • What: Requirements elicitation and prioritization.
  • When: Before the requirement workshop – preferably at least a day in advance.
  • Who: Product owner, business analyst, customer, key stakeholders
  • Outcome: A candidate user story, scoped with relevant business rules (acceptance criteria). There should be enough detail to allow the development team to explore the scope of the story using concrete examples.

#2 Requirement Workshop

  • What: Discuss the user story by focusing on rules and examples.
  • When: Regularly throughout the project – we recommend running short workshops several times a week.
  • Who: All roles must be represented at this meeting (at least the three amigos), but multiple representatives of each role can attend. Each role representative has their own responsibility and focus.
  • Outcome: The candidate story is refined, and is frequently decomposed into smaller stories, each accompanied by a set of rules and examples. The examples should be captured in as light a format as possible, and should not be written using Given/When/Then.

#3 Formulate

  • What: Formulate the examples into scenarios.
  • When: Before the implementation of the story starts. Best done as the first task of development, but sometimes done as a separate workshop where all scenarios scheduled for the iteration are formulated.
  • Who: In the beginning, when the language and style we use to phrase the scenarios is still being established, it is recommended to do it with the entire team. Later, it can be efficiently done by a pair: a developer (or someone who is responsible for the automation) and a tester (or someone who is responsible for quality) as long as their output is actively reviewed by a business representative.
  • Outcome: Scenarios added to source control. The language of the scenarios is business readable and consistent.

#4 Review

  • What: Review the scenarios to ensure they correctly describe expected business behavior.
  • When: Whenever a scenario is written or modified.
  • Who: Product owner (and maybe business analyst, customer, key stakeholders).
  • Outcome: Confidence that the development team have correctly understood the requirements of the business; the behavior is expressed using appropriate terminology.

#5 Automate

  • What: Automate the scenarios by writing test automation code.
  • When: Automate scenarios before starting the implementation, following a test driven approach. This way the implementation can be “driven” by the scenarios, so the application will be designed for testability and the development team will have greater focus on real outcomes.
  • Who: Developers or test automation experts. When doing pair programming, pairing a developer with a tester works well.
  • Outcome: Set of (failing) automated scenarios that can be executed both locally and in continuous integration/delivery/deployment environments.

#6 Implement

  • What: Implement the application code to make the automated scenarios pass. Completed through TDD cycle of Red/Green/Refactor.
  • When: Implementation starts as soon as the first scenario has been automated, so the implementation is being driven by a failing scenario.
  • Who: Developers.
  • Outcome: A working application that behaves as specified. This can be verified automatically.

#7 Supplementary Test

  • What: Perform manual and other forms of testing, described in test strategy document (e.g., scripted, manual testing, exploratory testing, performance, and security).
  • When: As soon as enough is known about the story to begin testing. Scenarios provide a functional breakdown of the user story, so each scenario itself contributes a meaningful part of the application’s behavior. Test preparation can start even earlier.
  • Who: Testers – other team members can help with some aspects of testing, but these activities are usually coordinated by testers.
  • Outcome: High quality working application; the story is done.

#8 Release

  • What: Produce a feature that can be delivered to production. A released product should be used to gather feedback from the users, which can provide input to future development cycles.
  • When: At any time that all tests are passing for a feature.
  • Who: The development team is responsible for producing the releasable features, but DevOps is usually responsible for delivering the finished feature to production.
  • Outcome: An “done” release package.

4.2 BDD in Scrum

In Scrum, work is organized into sprints that are 2-4 week iterations. There are regular workshops that focus on the customer’s requirements throughout each Sprint (backlog refinement, backlog grooming sprint planning preparation, sprint planning) where user stories are prepared.

At the Sprint Planning meeting, the team chooses a few stories to implement in the upcoming sprint.

Once the Sprint is done, the team presents their results in a Sprint Review/Demo and potential process improvements are discussed in the Sprint Retrospective.

Requirement Workshops

In BDD, the team will explore and discover details of stories as part of refinement activities If the Product Owner is available, then they should organize short Example Mapping sessions regularly to replace backlog refinement meetings. Examples will help focus the work on outcomes.

Formulate

Establishing a shared understanding is important, but making the entire team discuss the best way to express a scenario in business language is not efficient.

The best time to formulate the details of scenarios is outside the requirement meetings. Formulation is usually undertaken by a pair, often a developer and a tester.

In some projects, the scenarios have to be formally approved by the product owner or someone else. In these cases, the formulation has to be prioritized and planned in a way that the team does not get blocked.

How scenarios help with the decomposition into tasks:

“In Scrum, stories are usually broken down into tasks. Tasks are work units that represent the design decisions of the team and they are also used to track the daily progress of the team.”

Chapter 4 – BDD in Scrum

Tasks are owned by the development team The tasks are often technical and do not have to be understandable by the Product Owner. However, examples and scenarios should describe the functional breakdown of the story (business readable).

Tasks are aligned to scenarios, which results in several benefits:

  • The team will focus on the expected behavior during the implementation.
  • Feedback about the story implementation earlier.
  • Manual testing can be started before the story is fully implemented.
  • The functional progress provides better transparency and hence increases the trust between the development team and the product owner.

4.3 BDD in Lean/Kanban

Kanban optimizes end-to-end delivery (“lead time”) by visualizing the workflow and limiting work in progress (WIP) to be able to detect and fix bottlenecks more easily.

The activities of the BDD approach are realized in user stories, which are the typical work unit tracked on Kanban boards. Example Mapping sessions can be used to feed the input of the development pipeline whenever capacity allows.

For automation implementation, an additional column would be added to the Kanban board. The tasks formulate, automate, implement, review and supplementary test can be seen as a sub-workflow.

4.4 BDD in Distributed Teams

BDD in distributed teams is carried out in the same way as for co-located teams. Good audio-visual facilities and collaborative online tools are essential. Providing information about the scenario implementation status can lead to improved cooperation between developers, testers, and product owners.

Requirement Workshops with Distributed Teams

Modifications are necessary over the use of index cards in Example Mapping. •A remote requirement workshop will still maintain the same standards:

  • Focus on rules and examples when discussing the story
  • Nominate a facilitator who keeps the meeting going
  • Collect results in a format that all team members can understand, so that They can challenge them if necessary
  • Capture questions that block the discussion and make them visible to everyone
  • Provide an easy way to have an overview of what we have discussed already
  • Produce shared notes

There is no online implementation of Example Mapping; however, Google Sheets can be used as an active workspace during the remote requirement workshop.

4.5 BDD in Fixed Scope Projects

“Projects with fixed price, fixed scope, fixed “everything” are definitely not ideal for agile software development, especially when we’re building highly complex, sophisticated and usable applications in a rapidly changing business environment.”

Chapter 4 – BDD in Fixed Scope Projects

Typical fixed scope projects are provided with a detailed specification document that is supposed to describe all the necessary details to provide a cost estimate.

A large portion of work is about understanding the domain, trying to provide solutions for the requirements that satisfy the customer, stay within the scope of the original, contracted specification document, and stay within budget. BDD can help to provide a frame for domain discovery and for documenting the detailed requirement decisions the team makes.

Use Example Mapping to prepare the individual features for development. When a feature is ready for development, the specification document should be used to build an Example Map with all the rules and illustrative examples. The static specification document can be transformed into a continuously validated living document.

4.6 BDD in Regulated Environments

Regulated Environments focus on the following areas:

  • Completeness and correctness of the specification
  • Coverage provided by the tests and the testing strategy in general
  • Evidence that the testing has been performed for a particular version

BDD applies to a regulated environment in the following ways:

  • The scenarios are selected initially to be illustrative examples of the specifications. The aim is to ensure consistency and shared understanding across the team.
  • The set of scenarios can be extended by further test cases using the same format, to reach the coverage prescribed by the testing strategy.
  • The scenarios are business readable and they bring together the specification and the tests. This duality ensures a higher consistency and linkage between these areas.
  • The scenarios are strictly versioned, together with the application code.
  • BDD tools typically execute scenarios directly and produce a report of the execution result.

Running automated scenarios in this environment will document the expected behavior, describe the tests that verify the behavior, and provide evidence of execution.

4.7 What We Just Learned

BDD is a set of practices that, when combined, can improve the quality of a team’s development process.

BDD integrates with various common development methodologies and team configurations.

With appropriate technology support, BDD can work well for distributed teams, acting as an aid to collaboration.

From the Pipeline v18.0

This entry is part 18 of 23 in the series From the Pipeline

The following will be a regular feature where we share articles, podcasts, and webinars of interest from the web.

Jenkins Documentation Progress

Jenkins joined the Continuous Delivery Foundation in 2019 as one of the first open source projects. Documentation changes are proposed via pull requests to the Jenkins.io GitHub repository. They show an improvement between the proposal of a pull request and a response to the pull request. Jenkins also has managed to merge 85% of pull requests within a 24-hour window. Another recent positive change is the support for plugin documentation stored inside the GitHub repositories. They know have blog posts, documentation, webinars, conversion tools, and progress measurements to assist plugin maintainers and other contributors as they migrate documentation from the Jenkins wiki to the plugin GitHub repositories.

Scientists rename human genes to stop Microsoft Excel from misreading them as dates

27 human genes have been renamed because Microsoft Excel kept misreading their symbols as dates. Excel is commonly used in sciences to store and examine data, with many instances of data becoming corrupted by Excel’s auto-formatting. A study from 2016 showed that nearly one-fifth of all published papers had been affected by Excel errors. The HUGO Gene Nomenclature Committee has recently published new guidelines for gene naming that include symbols that affect data handling and retrieval. This story is an excellent example of software design decisions having unintended consequences for users. In this instance, the users changed their behavior to adapt to the software because the issue was so widespread it was easier to change naming genes than to expect Microsoft to update Excel.

SelectorsHub: The Next Gen XPath, CSS Selectors Tool

Selenium locators are a core part of how the open-source tool finds & interacts with web elements. Selecting a dynamic locator or generic locator often results in flaky tests. Two of the most popular locators are CSS and XPath. The SelectorsHub tool is a browser extension that auto-suggests all the possible combinations of attributes, text, siblings, etc to build selectors. The tool also supports those pesky iFrames and SVG elements. Overall a pretty cool feature released by LambdaTest!

Improving Test Data Collection and Management

“There is much published about the data we generate to assess product quality. There is less discussion about the data testers generate for our own use that can help us improve our work—and even less is said about recommended practices for data collection. Test data collection, management, and use all call for upfront planning and ongoing maintenance. Here’s how testers can improve these practices.”

CukenFest 2020 On-Demand

Many tech events went from in-person to virtual this year. Cukenfest was no different. After joining the SmartBear team, the folks over at Cucumber now have access to more resources to spread the word about BDD. This year CukenFest is online, with all the recordings of the sessions available for viewing. Check it out!

Book Club: Behavior Driven Development – Discovery (Chapter 3)

This entry is part 3 of 5 in the series BDD Discovery

The following is a chapter summary for “BDD Books – Discovery” by Gaspar Nagy and Seb Rose for an online book club.

The book club is a weekly lunchtime meeting of technology professionals. As a group, the book club selects, reads, and discuss books related to our profession. Participants are uplifted via group discussion of foundational principles & novel innovations. Attendees do not need to read the book to participate.

Background on BDD Discovery

DISCOVERY

“Explore behavior using examples

Written by the creator of SpecFlow and the author of The Cucumber for Java Book, this book provides inside information on how to get the most out of the discovery phase of Behaviour Driven Development (BDD). This practical guide demonstrates good collaboration techniques, illustrated by concrete examples.

This book is written for everyone involved in the specification and delivery of software (including product owners, business analysts, developers, and testers). The book starts by explaining the reasons BDD exists in the first place and describes techniques for getting the most out of collaboration between business and delivery team members.

This is the first in the BDD Books series that will guide you through the entire development process, including specific technical practices needed to successfully drive development using collaboratively-authored specifications and living documentation.”

BDD Discovery

Chapter 3

This chapter answers the questions: “Are examples really enough to specify a feature? How many examples do we need to specify a feature?”

3.1 How Hard is Concrete?

Outcome: description of the state of the system after the user or system behavior has taken place. It should contain enough detail to measure the behavior against expectations.

Action: the event that causes the behavior to take place. It might be some action by a user, the system, a scheduled job, or any other stimulus that can cause the system to react.

Context: describes the state of the system before the action takes place.

Anatomy of an Example

3.2 Is All That Concrete Essential?

Rules are generic expressions of how the system ought to behave – they each cover lots of possible situations. An example expresses a single situation that illustrates an application of a rule. The purpose of the example is to clarify a rule; each example must be specific and precise.

Each example illustrates a single rule, and should only mention concrete data that is directly related to the behavior being illustrated.

Getting the right level of detail is not the primary concern – inessential detail should be removed later when examples are formatted as scenarios.

3.3 How Many Examples Do We Need?

All possible states cannot be reasonably captured in Examples. A balance must be achieved between Examples and Business Rules.

The team determined that the delivery address can’t be changed once an order has moved beyond the “waiting for pickup” state. The team resolved the misunderstanding by using examples. Please refer to Figure 17. A happy middle ground must be reached in describing enough examples to deliver the feature and writing too many features for a given business rule that preclude efficient delivery of the software.

3.4 Why Stop Now?

“Catching all implementation mistakes will be important, but during the discovery phase our focus is on the requirements: we would like to prevent bugs from ever happening.”

Chapter 3 – Why Stop Now?

The Examples demonstrate the development team understands what they are being asked to do and that the business understands what they’re asking for.

“When we start considering the exhaustive exploration of all possible combinations, we have moved away from understanding the requirements into the realm of software testing. When the examples start to address concerns that the product owner is not interested in, it’s time for the facilitator to bring the discussion back on track.”

Chapter 3 – Why Stop Now?

Good coverage for test cases is still important, however this is an activity outside the requirement workshop. The intent of the workshop is engage the product owner and the team.

3.5 Rules vs. Examples

Are examples alone sufficient to specify the functionality of an application? It is not always possible to “reverse engineer” the rules from the examples. Both rules and examples are needed to document the expected behavior of the system.

“The rules provide the concise, abstract description, and the examples provide precise, concrete illustrations of them.”

Chapter 3 – Rules vs. Examples

Why “Specification by Example”? The emphasis is on the use of examples to support a specification by making it harder for the rules to be misinterpreted.

Rules and examples are not the only way to specify the behavior of software. Other tools complement them, such as: definitions, model diagrams, formulas, and glossaries.

3.6 My Example Illustrates Multiple Rules!

Try to come up with Examples that illustrate a single rule. Focusing on a rule and utilizing it are two different things. Consider whether the example utilizes the rules, focuses on the rule, and/or illustrates the rule.

If an example illustrates multiple rules, then split the example into several that each focus on a single rule.

3.7 The Bigger Picture

Short, focused examples illustrate the behavior of a single rule, but the overview of the whole system behavior is missed.

Leverage wireframes, page-flows, box-and-arrow diagrams, and other tools to illustrate the application behavior.

3.8 What We Just Learned

The requirement workshop is an excellent place discuss the understanding of the requirements. Creating concrete examples that illustrate the rules are challenging.

Examples on their own are not sufficient; rules should be documented as well. An Example is comprised of context, action, and outcome.

Examples should illustrate a single rule and contain only data essential to understand the behavior of the rule.