Please note - This is part 4 of the article -
If you missed parts 1, 2 or 3 , please scroll down to
read them
In Parts I and II of this article series, we introduced the
nature of regression, impact analysis and regression prevention. In
Part III we looked at Regression Testing and how we select
regression tests. This article focuses on the automation of
regression testing.
Much has been written on the challenges and pitfalls of test
automation. The lessons learned by practitioners in the mid-90s are
substantially the same as those facing practitioners today. I have
to say that it's a cause of some frustration that many companies
still haven't learnt them. In this article, there isn't space to
repeat those lessons. The referred papers, books and blogs at the
end of this article focus on implementing automation, primarily
from a user interface point of view, and sometimes as an end in
itself. To complement these texts, to bring them up to date and
focus them on our anti-regression objective, the remainder of this
article will set out some wider considerations.
Regression test objectives and (or versus?)
automation
The three main regression test objectives are set out below
together with some suggestions for test automation. Although the
objectives are distinct, the differences between regression testing
and automation for the three objectives are somewhat blurred.
|
Anti-Regression Objective
|
Source of Tests
|
Automation Considerations
|
- To detect unwanted changes to trusted functionality.
|
Functional system tests
|
Consider the criteria in references 6, 7, 8
|
|
|
Integration tests
|
Most likely to be automated using drivers to component and
sub-system interfaces
|
- To detect unwanted changes (to support technical
refactoring).
|
Test-first, test-driven environments generate automated tests
naturally
|
Consider reference 9 and the discussion of testing in TDD and
Agile in general.
|
- To demonstrate to stakeholders that they can still do
business.
|
Acceptance Tests, business process flows, 'end to end'
tests.
|
Consider the criteria in references 6, 7, 8 but expect mostly
manual testing for demonstration purposes.
See reference 10 for an introduction to Acceptance Driven
Development.
|
Regression objectives reframed: detecting regression v
providing confidence
Of the three regression test objectives above, objectives 1 and
2 are similar. What differentiates them is who (and where) they
come from. Objective 1 comes from a system supplier perspective and
tests are most likely to be sourced from system or integration
tests that were previously run (either manually or automated).
Objective 2 comes from a developer or technical perspective where
the aim is to perform some refactoring in a safe environment. By
and large, 'safe' refactoring is most viable in a Test-Driven
environment where all unit tests are automated, probably in a
Continuous Integration regime. (Although refactoring at any level
benefits from automated regression testing).
If objectives 1 and 2 require tests to demonstrate 'functional
equivalence', regression test coverage can be based on the need to
exercise the underlying code and cover the system functionality.
Potentially, tests based on equivalence partitioning ought to cover
the branches in code (but not housekeeping or error-handling
functionality - but see below). Tests covering edge conditions or
boundary values should verify the 'precision' of those decisions.
So a reasonable guideline could be - use automation to cover
functional paths through the system and data-drive those tests to
expand the coverage of boundary conditions. The automation does
not necessarily have to execute tests that would be recognisable to
the user, if the objective is to demonstrate functional
equivalence.
Objective 3 - to provide confidence to stakeholders is slightly
different. In this case, the purpose of a regression test is to
demonstrate to end users that they can execute business
transactions and use the system to support their business. In this
respect, it may be that these tests could be automated and some
automated tests that fall under the category 1 and 2 above will be
helpful. But experience of testing GUI applications in particular
suggests that end users sometimes only trust their own eyes and
need to have a hands-on experience to give them the confidence that
is required. Potentially, a set of automated tests might be used to
drive a number of 'end to end' transactions, and reconciliation or
control reports could be generated to be inspected by end users.
There is a large spectrum of possibilities of course. In summary,
automated tests could help, but in some environments, the need for
manual tests as a 'confidence builder' cannot be avoided.
At what level(s) should we automate regression
tests?
In Part III of this article series, we identified three levels
at which regression testing might be implemented - at the
component, system and business (or integrated system) levels. These
levels should be considered as complementary and the choice is
where to place emphasis, rather than which to include or exclude.
The choice of automation at these levels is not really the point.
Rather, a level of regression testing may be chosen primarily
to achieve an objective, partly on the value of information
generated and partly because of the ease with which the tests can
be automated.
What are the technical considerations for
automation?
At the most fundamental, technical level, there are four aspects
of the system under test that must be considered. How the system
under test is stimulated, and how the test outcomes of interest
(with respect to regression) will be detected.
Mechanisms for stimulating the system under
test
This aspect reflects how a test is driven by either a user or an
automated tool. Nowadays, the number of user and technical
interfaces in use is large - and growing. A table of the most
common are presented and some suggestions made.
|
PC/Workstation-based applications and clients
|
- Proprietary or open source GUI-object based drivers
- Hardware (keyboard, video, mouse) based tools - physically
connected to clients
- Software based automation tools driving clients working across
VNC connections
|
|
Browser/web-based applications
|
- Proprietary object-based agents
- Open source JavaScript-based agents
- Open source script languages and GUI toolkits
|
|
Web-Server-based functionality (HTTP)
|
- Proprietary or open source webserver/HTTP/S drivers
|
|
Web services
|
- Proprietary or open source web services drivers
|
|
Mobile applications
|
- Mobile OS simulators driven by integrated or separate GUI based
toolkits
|
|
Embedded
|
- Typically java-based toolkits
|
|
Error, failure, spate, race conditions or other situations
|
- May be simulated by instrumentation, load generation tools or
manipulation of the test environment or infrastructure
|
|
Environments
|
- Don't forget that environmental conditions influence the
behaviour of ALL systems under test.
|
There are an increasing number of proprietary and open source
unit and acceptance testing frameworks available to manage and
control the test execution engines above.
Outcome/Output detection and capture
A regression can be detected in as many ways as any outcome
(output, change of state etc.) of a system can be exposed and
detected. Here's a list of common outcome/output formats that we
may have to deal with. This is not a definitive list.
|
Browser-rendered output
|
- The state of any object on the document Object Model (DOM)
exposed by a GUI tool
|
|
Any screen-based output
|
- Image recognition by hardware or software based agents
|
|
Transaction response times
|
- Any automated tool with response time capture capability
|
|
Database changes
|
- Appropriate SQL or database query tool
|
|
Message output and content
|
- Raw packets captured by network sniffers
- Message payloads captured and analysed by protocol-specific
tools
|
|
Client or server system resources
|
- CPU, i/o, memory, network traffic etc. detected by performance
monitors
|
|
Application or other infrastructure - changes of state
|
- (Database, enterprise messaging, object request brokers etc.
etc.) - dedicated system/resource monitors or custom-built
instrumentation etc.
|
|
Changes in accessibility or usability (adherence to standards
etc.)
|
- Web page HTML scanners, character-based screen or report
scanners or screen image scanners
|
|
Security (server)
|
- Port scanning and server-penetration tools
|
Comparison of Outcomes
A fundamental aspect of regression testing is comparison of
actual outcomes (in whatever format from whatever source above) to
expected outcomes. If we are running a test again, the comparison
is between the new 'actual' output/outcome and previously captured
'baseline' output/outcome.
Simple comparison functionality of numbers, text, system states,
images, mark-up language, database content, reports, message
payloads, system resource is not enough. We need to have a
capability in our automation to:
Filter content: we may not need to compare 'everything'. Subsets
of database records, screen/image regions, branches or leaves in
marked up text, some objects and states but not others etc. may be
filtered out (of both actual and baseline content).
Mask content: of the content we filter out, we may wish to mask
out certain patterns of content such as image regions that do not
contain field borders; textual report columns or rows that contain
dates/times, page numbers, varying/unique record ids etc.; screen
fields or objects of certain colours, sizes, that are
hidden/visible; patterns of text that can be matched using regular
expressions and so on.
Calculate from content: the value, significance or meaning of
content may have to be calculated: perhaps the number of rows
displayed on a screen is significant; the error message, number or
status code displayed on a screen image, extracted by text
recognition; the result of a formula in which the variables are
extracted from an outputted report and so on.
Identify content meeting/exceeding a threshold: the significance
of output is determined by its proximity to thresholds such as:
CPU, memory or network bandwidth usage compared to pre-defined
limits; the value of a purchase order exceeds some limit; the
response time of a transaction exceeds a requirement and so on.
System Architecture
The architecture of a system may have a significant influence
over the choice of regression approach and automation in
particular. An example will illustrate. An increasingly common
software model is the MVC or model-view-controller architecture.
Simplistically (from WikipediaJ):
"The model is used to manage information and notify observers
when that information changes; the view renders the model into a
form suitable for interaction, typically a user interface element;
the controller receives input and initiates a response by making
calls on model objects. MVC is often seen in web applications where
the view is the HTML or XHTML generated by the app. The controller
receives GET or POST input and decides what to do with it, handing
over to domain objects (i.e. the model) that contain the business
rules and know how to carry out specific tasks such as processing a
new subscription."
A change to a 'read-only' view may be completely cosmetic and
have no impact on models or controllers. Why regression test other
views, models or controllers? Why automate testing at all - a
manual inspection may suffice.
If a controller changes, the user interaction may be affected in
terms of data captured and/or presented but the request/response
dialogue may allow complete control of the transaction and
examination of the outcome. In many situations, automated control
of requests to and from controllers (e.g. HTTP GETs and POSTs) is
easier to achieve than automating tests through the GUI (i.e. a
rendered web page).
Note that cross-browser test automation, to verify the behaviour
and appearance of a system's web pages across different browser
types, for example, cannot be handled this way. (Some functional
automation may be possible, but some usability/accessibility tests
will always be manual).
It is clear that the number and variety of the ways a system can
be stimulated and potentially regressive outcomes can be observed
is huge. Few, if any tools, proprietary or open source, have all
the capabilities we need. The message is clear - don't ever
assume the only way to automate regression testing is to use a
GUI-based test execution tool!
Regression test automation - summary
In summary, we strongly advise you to bear in mind the following
considerations:
- What is the outcome of your impact analysis?
- What are the objectives of your anti-regression effort?
- How could regressions manifest themselves?
- How could those regressions be detected?
- How can the system under test be stimulated to exercise the
modes of operation of concern?
- Where in the development and test process is it feasible to
implement the regression testing and automation?
- What technology, tools, harnesses, custom utilities, skills,
resources and environments do you need to implement the automated
regression test regime?
- What will be your criteria for automating (new or existing,
manual) tests?
Some Test Automation References
- Brian Marick, 1997, Classic Testing Mistakes,
http://www.exampler.com/testing-com/writings/classic/checklist.html
- James Bach, 1999, Test Automation Snake Oil,
http://www.satisfice.com/articles/test_automation_snake_oil.pdf
- Cem Kaner, James Bach, Bret Pettichord, 2002, Lessons Learned
in Software Testing, John Wiley and Sons
- Dorothy Graham, Paul Gerrard, 1999, the CAST Report, Fourth
Edition
- Paul Gerrard, 1998, Selecting and Implementing a CAST
Tool,
http://gerrardconsulting.com/?q=node/532
- Brian Marick, 1998, When Should a Test be Automated?
http://www.visibleworkings.com/papers/automate.pdf
- Paul Gerrard, 1997, Testing GUI Applications,
http://gerrardconsulting.com/?q=node/514
- Paul Gerrard, 2006, Automation below the GUI (blog
posting),
http://gerrardconsulting.com/index.php?q=node/555
- Scott Ambler, 2002-10, Introduction to Test-Driven
Design,
http://www.agiledata.org/essays/tdd.html
10. Naresh Jain, 2007, Acceptance-Test Driven
Development,
http://www.slideshare.net/nashjain/acceptance-test-driven-development-350264
In the final article of this series, we'll consider how an
anti-regression approach can be formulated, implemented and managed
and take a step back to summarise and recap the main messages of
these articles.
To be continued...