WHY THIS TOPIC?
• I am not native English speaker.
• New project with new business vocabulary.
• Problems implementing business requirements.
Missing conditions to test, half implemented
features.
• Project documentation (no linked to the code).
• Too much time wasted fixing bugs.
• Problems to get an understanding of the project,
and what the feature was developed for.
AGILE ACCEPTANCE TESTS (AAT)
Move Business rules (requirements) => Tests.
They are a bunch of automated tests built
collaboratively from the requirements during
specification workshops that lead the development,
ensuring that we are fulfilling our customer
expectations completely.
AGILE ACCEPTANCE TESTS (AAT)
They will focus the development.
They will be a live documentation of our project.
They will make changes easier.
Instead of discovering problems, we need to
work out how to stop them from appearing
in the first place.
Building the product right and
building the right product are 2
different things.
ADVANTAGES
The biggest benefit of agile acceptance testing is improve communication and
mutual understanding, not test automation.
• Developer
– Most functional gaps and inconsistencies in the requirements and
specifications will be flushed out before development starts.
– Be sure business analyst understand special cases that you want to discuss
with them.
– You will have automated tests as targets to help you focus the development.
– It will be easier to share, hand over and take over code.
• Tester
– You can influence the development and stop developers from making the same
mistakes.
– Better understanding of the domain.
– Will delegate a lot of dull work to developers, who will collaborate with you on
automating the verifications.
– You can build in quality from the start by raising concerns about possible
problems before development starts.
– You will be able to verify business rules with a touch of a button.
– More time for exploratory testing.
AAT IN A NUTSHELL
1. Use real-world examples to build a shared
understanding of the domain.
2. Select a set of these examples to be a specification
and an acceptance test suite.
3. Automate verification of the acceptance tests.
4. Focus the software development effort on the
acceptance tests.
5. Use the set of acceptance tests to facilitate discussion
about future change requests, effectively going back
to step 1 for a new cycle of development.
SPECIFICATION WORKSHOP
The primary output of the workshop is a tangible set of
realistic examples that explain how the system should
behave once the next phase is complete.
The key feature of these examples is that they should
provide enough information for developers to
implement and for testers to verify the stories planned
for the iteration.
We want to discuss what the software does, not
how it does it.
Enables developers and testers to learn about the
domain.
Building a domain language.
SELECT EXAMPLES AND
AUTOMATING.
We need to distil what should be done and not really focus on how it is
going to work.
Examples should be SMART (Naresh Jain)
Specific: They are explicitly defined and definite
Measurable – the result is observable and quantifiable
Achievable – they describe a realistic scenario
Relevant – they are related to the particular story
Time bound – the result can be observed almost instantly
Formalising examples into tests is the final phase in which we should
iron out any ambiguities and inconsistencies.
Mix different tools to test different types of requirements. (Selenium, Fit
and Fitnesse, Gatling ...)
FOCUSING DEVELOPMENT
In practice, Acceptance tests provide a very good specification for
required functionality.
Acceptance tests provide design hints.
A piece of code is complete when all the related acceptance tests
run correctly.
Unit Tests vs. Acceptance Tests.
To mock or not to mock.
We should use the same names for concepts in the code as the names
used in the acceptance tests.
TOOLS
Today
Fit and Fitnese, Concordion and Jbehave for business domain testing.
Selenium, CubicTest and StoryTestIQ might help with UI tests.
To maintain UI tests more easily, use page objects or domain-specific
keywords to describe actions in a business language.
TextTest can be an interesting choice for inspecting workflows and building up
regression test suites for existing systems.
Tomorrow
Domain Specific Language.
SUMMARY
Programming tools, practices and methods are
definitely important, but if the communication
fails the rest is just painting the corpse.
Both unit tests and AAT are important.
AAT and Specification by example help business
people, software developers and testers to
communicate better and understand each other.
They will be our live documentation.
They will help to ensure that all of us understand
the same from the requirements.
I know that in FEXCO we are lucky because we have direct line to our customers, at least in Bureau, what makes very easy to validate the requirmentes and solve our doubts as we are implementing the feature. We will be able to trace the sprint, checking how many of those test have been already implemented. Using examples as specifications consistently throughout the project helps to avoid the effects of the telephone game and enables us to truly build a shared understanding of the system.
Having a live and relevant specification of the system helps new team members to get started and understand the project. It also protects us from the ‘bus effect’, whereby we lose important knowledge if the only person who knows what the system does gets hit by a bus (or in a more realistic scenario leaves the team for a different job). The representative set of examples, formalised into acceptance tests and connected to the code by test automation, plays the role of a live specification of the system – the authoritative source of what the system does and how it behaves. Make changes easier Acceptance tests are an authoritative description of what the system does. (live specification) We can have the same level of confidence in acceptance tests as in executable code. We can use existing acceptance tests to discuss future changes. If an earlier test fails, immediately discuss with customers whether it specifies obsolete functionality. If yes, take it out. If not found a bug. Acceptance tests should not be the complete regression testing suite. They are only a good start.
1 - Instead of abstract requirements that can easily be misinterpreted, we should talk about what the system does or should do in real-world situations. 2 - Once we have identified enough examples for everyone to be comfortable with starting the implementation, we can actually use the examples as the acceptance criteria for the current iteration of development. A selected set of examples can become the target for development – effectively the solution specification. 3 - If we are moving away from the target, I'd like to know this sooner rather than later. So we want to be able to check the examples often, to make sure that the code is going towards the target. 4 - At the end of the project all the examples should work. Because we ideally have a complete set of examples, if all the examples work there is nothing else that should be developed. So we can actually focus the development on satisfying the examples. This helps to avoid just-in-case code , which is what happens when developers have to think about all the edge cases to satisfy an abstract requirement. 5 - Once the development is done, change requests will start coming in. We can use the set of acceptance tests for previous phases of development as a relevant authoritative document on the system.
Just writing the specifications or requirements as realistic examples instead of abstract sentences is not enough. To get the most out of realistic examples, we need to put them to an open discussion and give everyone a chance to review them and ensure that we all understand the same thing. To create those examples we need to bring the whole team together in what the author call Specification workshop, to discuss the requirements and create the examples that are going to lead the development for the next iteration. We had some of these but we didn’t came with real examples of what needs to be implemented (Preorders, Credit Sweep, ...)
One very useful feature of realistic examples is that they are often easily verifiable. They have precise starting values and precise expected results. Once the software has been developed, we can actually check whether the system pays out 14 pounds after 7672 clicks or not. We use the examples that come out of workshops, described in the previous chapter, to specify how a piece of software should behave once it is implemented and confirm that it actually does what we want it to do. Examples of system behaviour effectively become our acceptance criteria for the current phase of development. Therefore, the workshop often produces a number of examples that demonstrate identical rules. To make tests easier to read, understand and verify, we should select one representative example out of each such set and add it to the set of tests. If testers suspect that particular specific values are likely to cause bugs, add these examples as well, even though they might demonstrate a rule that has already been added to the tests. Having these as tests will make sure that the bugs do not appear in the code. 1 – David Peterson suggests4 that acceptance tests should be selfexplanatory with a plain English description of the rule at the top followed by the examples, that examples should only demonstrate the rule and not include any extraneous details, 2 - When formalising examples into tests, be careful to identify individual rules and specify a separate test for each of them. 3 - A test should have just enough detail to provide a full context for understanding and verification, and no more. Zero quality control. Tests should be self-explanatory. Each test should specify only one thing. Focus the test on the rule being tested. Keep tests human-readable.
We had some of these but we didn’t came with real examples of what needs to be implemented (Preorders, Credit Sweep, ...)
Agile acceptance testing helps a lot in this respect, because it gives us acceptance tests that were collaboratively produced to tell developers exactly what is needed. Once the acceptance criteria for the next phase of the project are captured in acceptance tests, the expected result of development is clearly specified in a measurable and verifiable form. From this moment, the actual development can focus on fulfilling these requirements. Unit tests verify that the code is right, and acceptance tests verify that you have the right code . We need both!!! I like to execute acceptance tests in an environment as close to the real thing as possible and avoid any mocking. Using mock objects in unit tests is OK because it promotes isolation of code units. Using mock objects in acceptance tests can hide serious integration problems. When an acceptance test passes, the development should really be done. If mock objects are extensively used for acceptance tests, then you will quickly lose track of what has really been done and what still needs work. This is why acceptance tests must connect to a real database, use real services if possible and in general provide us with as much assurance as possible that the thing really does what the customers want. Because of this, acceptance tests often run much slower than unit tests Even if your acceptance tests can run on developer machines, do not include them in the basic build. They will just slow down the turnaround time for implementing small changes. Unit tests should execute on every change to verify that bugs are not being introduced. This basic test run should not last more than a few seconds, as it has to be done frequently. Developers should run acceptance tests to verify that they have finished with a larger piece of code from a business perspective. Automated acceptance tests are easy to run, although they typically do not execute quickly (or at least not as quickly as unit tests). Developers should take advantage of this and run them periodically to verify that they are on the right track. A continuous integration system should also run acceptance tests for previous phases of the project overnight as a regression test to verify the system functionality. If you do this, it is a good idea to publish the results somewhere where the business people, project managers and customers can see them.
The idea of domain-specific languages (DSL) seems to be gaining a lot of momentum currently. The basic idea is to create a specific mini programming language, often based on some action-oriented keywords, focused on a particular business domain and even tailored to the needs of a particular customer. We then use this mini-language to describe business processes and constraints. Business people and domain experts can then effectively participate in programming – even if they don't want to write in the language themselves, they will at least be able to read and understand it. So domain-specific languages can improve communication in a project. Another rationale behind this idea is that domain-specific language constructs allow us to describe the business problem more efficiently than with general purpose languages. The mini-language is ultimately implemented in a general purpose language such as Java or C#, so that process definitions written in the business language can be integrated with the infrastructure. This idea is very close to the concept of writing acceptance tests so that business people can understand them. In agile acceptance testing, the acceptance tests are written in business language and serve as a specification for the code. Verifications and actions related to the business language keywords are then implemented in a general purpose language, for example Java or C#.