One difference between ATDD and UTDD becomes clear when you examine who is involved in the process. We will call this the “Audience” for the process in this blog.
Acceptance tests should be created by a gathering of representatives from every aspect of the organization: business analysts, product owners, project managers, legal experts, developers, marketing people, testers, end-users (or their representatives), etc.
ATDD is a framework for collaboration that ensures complete alignment of the development effort that is to come with the business values that should drive it. These business values are complex and manifold, and so a wide range of viewpoints must be included. Acceptance tests should be expressed in a way that can be written, read, understood, and updated by anyone in the organization. They should require no technical knowledge, and only minimal training.
The specific expression of an acceptance test should be selected based on the clarity of that form given on the nature of the organization and its work. Many people find the “Given, When, Then” textual form (often referred to as “Gherkin”) to be the easiest to create and understand. Others prefer tables, or images, or other domain-specific artifacts.
We once worked with an organization that did chemical processing. We noted that in all their conversations and meetings, they used images like this in their PowerPoint slides and on the whiteboards, etc.:
To most people (including myself) these would not be easy to understand, but for this organization it was obvious and clear. For them, expressing their acceptance tests this way lowered the bar of comprehension. Why make them convert this into some textual or other representation? Use their language, always.
Typical business analysts spend much of their time looking at spreadsheets, or Gantt charts, or Candlestick charts, etc… The point is, once the stakeholders of a given piece of software are identified, then the form of the expression chosen should be whatever is clearest for them. They should be able to write the tests, read the tests, and update the tests as needed, without any understanding of computer code (unless the only stakeholders are literally other developers).
The notion of automating these tests should never drive their form. Any representation of acceptance can be make executable given the right tools, even if those tools must be created by the organization. Choosing, say, Robot or Fit or Specflow to automate your acceptance tests before you identify your stakeholders is putting the cart before the horse.
Unit tests should be written by technical people: developers and sometimes testers as well. They are typically written in the computer language that will be used to develop the actual system, though there are exceptions to this. But in any case, only people with deep technical knowledge can write them, read them, and update them as requirements change.
To ensure the suite of tests itself does not become a maintenance burden as it grows, developers must be trained in the techniques that make the UTTD effort sustainable over the long haul. This includes test structure, test suite architecture, what tests to write and how to write them, tests that should be avoided, etc. Training of the development team must include these critical concepts, or the process rapidly becomes too expensive to maintain.