Software QA and Testing Less-Frequently-Asked-Questions
This section of Softwareqatest.com is for those who have some experience in the
software development world and already have a grasp of QA and testing basics.
(For information on QA and Testing basics, see Softwareqatest.com sections
FAQ 1 and FAQ 2).
Items in this section address some 'beyond-the-basics' questions, along with
some discussion of possible answers.
Some of the questions have no definitive answers, some are questions
more often dealt with by upper management (if they are dealt with at all),
and some have more to do with psychology than technology. For
these reasons they tend to be questions that are less frequently
asked, even though they are important questions.
Additional items will be added over time. Some of the questions
shown were submitted previously by readers; suggestions for additional
topics are welcome.
Why is it often hard for organizations to get serious about quality assurance?
Who is responsible for risk management?
Who should decide when software is ready to be released?
What can be done if requirements are changing continuously?
What if the application has functionality that wasn't in the requirements?
How can QA processes be implemented without reducing productivity?
What if an organization is growing so fast that fixed QA processes are impossible?
Will automated testing tools make testing easier?
What's the best way to choose a test automation tool?
How can it be determined if a test environment is appropriate?
What's the best approach to software test estimation?
Why is it often hard for organizations to get serious about quality assurance?
Solving problems is a high-visibility process; preventing problems is
low-visibility. This is illustrated by an old parable:
In ancient China there was a family of healers, one of whom was known
throughout the land and employed as a physician to a great lord. The
physician was asked which of his family was the most skillful healer.
He replied,
"I tend to the sick and dying with drastic and dramatic treatments,
and on occasion someone is cured and my name gets out among the
lords."
"My elder brother cures sickness when it just begins to take
root, and his skills are known among the local peasants and
neighbors."
"My eldest brother is able to sense the spirit of sickness and
eradicate it before it takes form. His name is unknown outside our
home."
This is a problem in any business, but it's a particularly difficult
problem in the software industry. Software quality problems are
often not as readily apparent as they might be in the case of an industry
with more physical products, such as auto manufacturing or
home construction.
Additionally, many organizations are able to determine who is skilled at
fixing problems, and then reward such people. However, determining
who has a talent for preventing problems in the first place, and
figuring out how to incentivize such behavior, is a significant
challenge.
Return to top of this page's FAQ list
Who is responsible for risk management?
Risk management means the actions taken to avoid things
going wrong on a software development project, things that might
negatively impact the quality, timeliness, or cost of a project.
This is, of course, a shared responsibility among everyone involved in
a project. However, there needs to be a 'buck stops here'
person who can consider the relevant tradeoffs when decisions are
required, and who can ensure that everyone is handling their
risk management responsibilities.
It is not unusual for the term 'risk management' to never come up at all in
a software organization or project. If it does come up, it's often assumed
to be the responsibility of QA or test personnel. Or there may be a 'risks'
or 'issues' section of a project, QA, or test plan, and it's assumed that
this means that risk management has taken place.
The issues here are similar to those for the LFAQ question
"Who should decide when software is ready to be
released?" It's generally NOT a good idea for a test lead,
test manager, or QA manager to be the 'buck stops here' person
for risk management. Typically QA/Test personnel or managers
are not managers of developers, analysts, designers and many other
project personnel, and so it would be difficult for them to ensure
that everyone on a project is handling their risk management
responsibilities. Additionally, knowledge of all the considerations
that go into risk management mitigation and tradeoff decisions
is rarely the province of QA/Test personnel or managers. Based
on these factors, the project manager is usually the most appropriate
'buck stops here' risk management person. QA/Test personnel can,
however, provide input to the project manager. Such input could
include analysis of quality-related risks, risk monitoring,
process adherence reporting, defect reporting, and other information.
Return to top of this page's FAQ list
Who should decide when software is ready to be released?
In many projects this depends on the release criteria for the software.
Such criteria are often in turn based on the decision to end testing,
discussed in FAQ #2 item "How can it be
known when to stop testing?" Unfortunately, for any but the
simplest software projects, it is nearly impossible to adequately
specify useful criteria without a significant amount of assumptions
and subjectivity. For example, if the release criteria is based
on passing a certain set of tests, there is likely an assumption
that the tests have adequately addressed all appropriate software
risks. For most software projects, this would of course be
impossible without enormous expense, so this assumption would be
a large leap of faith. Additionally, since most software projects
involve a balance of quality, timeliness, and cost, testing
alone cannot address how to balance all three of these competing
factors when release decisions are needed.
A typical approach is for a lead tester or QA or Test manager to
be the release decision maker. This again involves significant
assumptions - such as an assumption that the test manager
understands the spectrum of considerations that are important in
determining whether software quality is 'sufficient' for
release, or the assumption that quality does not have to be balanced
with timeliness and cost. In many organizations, 'sufficient quality'
is not well defined, is extremely subjective, may have never been
usefully discussed, or may vary from project to project or even
from day to day.
Release criteria considerations can include deadlines, sales
goals, business/market/competitive considerations, business segment
quality norms, legal requirements, technical and programming
considerations, end-user expectations, internal budgets, impacts
on other organization projects or goals, and a variety
of other factors. Knowledge of all these factors is
often shared among a number of personnel in a large organization,
such as the project manager, director, customer service manager,
technical lead or manager, marketing manager, QA manager, etc.
In smaller organizations or projects it may be appropriate
for one person to be knowledgeable in all these
areas, but that person is typically a project manager, not a
test lead or QA manager.
For these reasons, it's generally not a good idea for a test lead,
test manager, or QA manager to decide when software is ready to be
released. Their responsibility should be to provide input to the
appropriate person or group that makes a release decision. For
small organizations and projects that person could be a product
manager, a project manager, or similar manager. For larger
organizations and projects, release decisions might be made
by a committee of personnel with sufficient collective
knowledge of the relevant considerations.
Return to top of this page's FAQ list
What can be done if requirements are changing continuously?
This is a common problem for organizations where there are expectations
that requirements can be pre-determined and remain stable. If these
expectations are reasonable, here are some approaches:
- Work with the project's stakeholders early on to understand
how requirements might change so that alternate test plans and
strategies can be worked out in advance, if possible.
- It's helpful if the application's initial design allows
for some adaptability so that later changes do not require
redoing the application from scratch.
- If the code is well-commented and well-documented this makes
changes easier for the developers.
- Use some type of rapid prototyping whenever possible to help customers
feel sure of their requirements and minimize changes.
- The project's initial schedule should allow for some extra
time commensurate with the possibility of changes.
- Try to move new requirements to a 'Phase 2' version of an
application, while using the original requirements for the
'Phase 1' version.
- Negotiate to allow only easily-implemented new requirements
into the project, while moving more difficult new requirements
into future versions of the application.
- Be sure that customers and management understand
the scheduling impacts, inherent risks, and costs of
significant requirements changes. Then let management or
the customers (not the developers or testers) decide
if the changes are warranted - after all, that's their job.
- Balance the effort put into setting up automated testing
with the expected effort required to refactor them to deal
with changes.
- Try to design some flexibility into automated test
scripts.
- Focus initial automated testing on application aspects that
are most likely to remain unchanged.
- Devote appropriate effort to risk analysis of changes
to minimize regression testing needs.
- Design some flexibility into test cases (this is not easily done;
the best bet might be to minimize the detail in the test cases,
or set up only higher-level generic-type test plans)
- Focus less on detailed test plans and test cases and more on
ad hoc testing (with an understanding of the added risk that
this entails).
If this is a continuing problem, and the expectation that requirements
can be pre-determined and remain stable is NOT reasonable, it
may be a good idea to figure out why the expectations are not
aligned with reality, and to refactor an organization's or project's
software development process to take this into account. It may be
appropriate to consider agile development approaches.
Also see
What is Extreme Programming and what's it got to do with testing?
in the Softwareqatest.com FAQ #2.
Return to top of this page's FAQ list
What if the application has functionality that wasn't in the requirements?
It may take serious effort to determine if an application
has significant unexpected or hidden functionality, and it could
indicate deeper problems in the software development process.
If the functionality isn't necessary to the purpose of the
application, it should be removed, as it may have unknown impacts
or dependencies that were not taken into account by the designer
or the customer. (If the functionality is minor and low risk then
no action may be necessary.) If not removed, information will be
needed to determine risks and to determine any added testing
needs or regression testing needs. Management should be made
aware of any significant added risks as a result of the
unexpected functionality.
This problem is a standard aspect of projects that include COTS
(Commercial Off-The-Shelf) software or modified COTS software. The COTS
part of the project will typically have a large amount of functionality
that is not included in project requirements, or may be simply undetermined.
Depending on the situation, it may be appropriate to perform in-depth
analysis of the COTS software and work closely with the end user to determine
which pre-existing COTS functionality is important and which functionality
may interact with or be affected by the non-COTS aspects of the project.
A significant regression testing effort may be needed (again, depending
on the situation), and automated regression testing may be useful.
Return to top of this page's FAQ list
How can Software QA processes be implemented without reducing productivity?
By implementing QA processes slowly over time, using
consensus to reach agreement on processes, focusing on processes that
align tightly with organizational goals, and adjusting/experimenting/refactoring
as an organization matures, productivity can be
improved instead of stifled. Problem prevention will
lessen the need for problem detection, panics and burn-out
will decrease, and there will be improved focus and less
wasted effort. At the same time, attempts should be made to
keep processes simple and efficient, avoid a 'Process Police' mentality,
minimize paperwork, promote computer-based processes and automated tracking
and reporting, minimize time required in meetings, and promote
training as part of the QA process. However, no one - especially
talented technical types - likes rules or bureaucracy, and
in the short run things may slow down a bit. A typical
scenario would be that more days of planning, reviews, and
inspections will be needed, but less time will be required for late-night
bug-fixing and handling of irate customers.
Other possibilities include incremental self-managed team approaches
such as 'Kaizen' methods of continuous process improvement,
the Deming-Shewhart Plan-Do-Check-Act cycle, and others.
Return to top of this page's FAQ list
What if an organization is growing so fast that fixed QA
processes are impossible?
This is a common problem in the software industry, especially
in new technology areas. There is generally no easy solution in this
situation. One approach is:
- Hire good people
- Management should 'ruthlessly prioritize' quality issues
and maintain focus on the customer
- Everyone in the organization should be clear on what
'quality' means to the customer
Depending on the growth rate, it is possible that
incremental self-managed team approaches may be applicable,
such as 'Kaizen' methods of continuous process improvement,
or the Deming-Shewhart Plan-Do-Check-Act cycle, and others.
Return to top of this page's FAQ list
Will automated testing tools make testing easier?
- Possibly. For small projects, the time needed to learn
and implement them may not be worth it unless personnel are already
familiar with the tools. For larger projects,
or on-going long-term projects they can be valuable.
- A common type of automated tool is the 'record/playback' type.
For example, a tester could click through all combinations
of menu choices, dialog box choices, buttons, etc. in an
application GUI and have them 'recorded' and the results
logged by a tool. The 'recording' is typically in the form of
text based on a scripting language that is interpretable by the
testing tool. Often the recorded script is manually modified and
enhanced. If new buttons are added, or some underlying code in
the application is changed, etc. the application might then be
retested by just 'playing back' the 'recorded' actions, and
comparing the logging results to check effects of the changes.
The problem with such tools is that if there are continual
changes to the system being tested, the 'recordings' may have to
be changed so much that it becomes very time-consuming to
continuously update the scripts. Additionally, interpretation and
analysis of results (screens, data, logs, etc.) can be a difficult
task. Note that there are record/playback tools for text-based
interfaces also, and for all types of platforms.
- Another common type of approach for automation of functional testing
is 'data-driven' or 'keyword-driven' automated testing, in which the
test drivers are separated from the data and/or actions utilized in testing
(an 'action' would be something like 'enter a value in a text box'). Test
drivers can be in the form of automated test tools or custom-written
testing software. The data and actions can be more easily maintained - such
as via a spreadsheet - since they are separate from the test drivers.
The test drivers 'read' the data/action information to perform specified
tests. This approach can enable more efficient control, development,
documentation, and maintenance of automated tests/test cases.
- Other automated tools can include:
code analyzers - monitor code complexity, adherence to
standards, etc.
coverage analyzers - these tools check which parts of the
code have been exercised by a test, and may
be oriented to code statement coverage,
condition coverage, path coverage, etc.
memory analyzers - such as bounds-checkers and leak detectors.
load/performance test tools - for testing client/server
and web applications under various load
levels.
web test tools - to check that links are valid, HTML code
usage is correct, client-side and
server-side programs work, a web site's
interactions are secure.
other tools - for test case management, documentation
management, bug reporting, and configuration
management, file and database comparisons, screen
captures, security testing, macro recorders, etc.
Test automation is, of course, possible without COTS tools. Many
successful automation efforts utilize custom automation software
that is targeted for specific projects, specific software applications,
or a specific organization's software development environment. In
test-driven agile software development environments, automated tests are
built into the software during (or preceding) coding of the application.
See the 'Tools' section for test tool
listings and the 'Web Tools' section
for web site testing tools.
Return to top of this page's FAQ list
What's the best way to choose a test automation tool?
It's easy to get caught up in enthusiasm for the 'silver bullet'
of test automation, where the dream is that a single mouse click can
initialize thorough unattended testing of an entire software application, bugs
will be automatically reported, and easy-to-understand summary reports
will be waiting in the manager's in-box in the morning.
Although that may in fact be possible in some situations, it is not the way
things generally play out.
In manual testing, the test engineer exercises software functionality to
determine if the software is behaving in an expected way. This means that
the tester must be able to judge what the expected outcome of a test should
be, such as expected data outputs, screen messages, changes in the
appearance of a User Interface, XML files, database changes, etc.
In an automated test, the computer does not have human-like 'judgement'
capabilities to determine whether or not a test outcome was correct.
This means there must be a mechanism by which the computer can
do an automatic comparison between actual and expected results
for every automated test scenario and unambiguously make a pass
or fail determination. This factor may require a significant
change in the entire approach to testing, since in manual
testing a human is involved and can:
- make mental adjustments to expected test results based
on variations in the pre-test state of the software system
- often make on-the-fly adjustments, if needed, to data
used in the test
- make pass/fail judgements about results of each test
- make quick judgements and adjustments for changes to requirements.
- make a wide variety of other types of judgements and adjustments
as needed.
For those new to test automation, it might be a good idea to do some reading
or training first. There are a variety of ways to go about doing
this; some example approaches are:
- Read through information on the web about test automation
such as general information available on some test tool vendor sites or
some of the automated testing articles listed in the Softwareqatest.com
Other Resources section.
- Obtain some test tool trial versions or low cost or open source
test tools and experiment with them
- Attend software testing conferences or training courses
related to test automation
As in anything else, proper planning and analysis are critical to success
in choosing and utilizing an automated test tool. Choosing a test
tool just for the purpose of 'automating testing' is not useful; useful
purposes might include: testing more thoroughly, testing in ways that were
not previously feasible via manual methods (such as load testing),
testing faster, or reducing excessively tedious manual testing. Automated
testing rarely enables savings in the cost of testing, although
it may result in software lifecycle savings (or increased sales)
just as with any other quality-related initiative.
With the proper background and understanding of test automation, the
following considerations can be helpful in choosing a test tool (automated
testing will not necessarily resolve them, they are only
considerations for automation potential):
- Analyze the current non-automated testing situation to determine
where testing is not being done or does not appear to be sufficient
- Where is current testing excessively time-consuming?
- Where is current testing excessively tedious?
- What kinds of problems are repeatedly missed with current testing?
- What testing procedures are carried out repeatedly (such as
regression testing or security testing)?
- What testing procedures are not being carried out repeatedly but
should be?
- What test tracking and management processes can be implemented
or made more effective through the use of an automated test tool?
Taking into account the testing needs determined by analysis of these
considerations and other appropriate factors, the types of desired test
tools can be determined. For each type of test tool (such
as functional test tool, load test tool, etc.) the choices can
be further narrowed based on the characteristics of the software
application. The relevant characteristics will depend, of course, on the
situation and the type of test tool and other factors. Such
characteristics could include the operating system, GUI components,
development languages, web server type, etc. Other factors affecting
a choice could include experience level and capabilities of
test personnel, advantages/disadvantages in developing a
custom automated test tool, tool costs, tool quality and
ease of use, usefulness of the tool on other projects, etc.
Once a short list of potential test tools is selected, several can be
utilized on a trial basis for a final determination. Any expensive
test tool should be thoroughly analyzed during its trial period to
ensure that it is appropriate and that it's capabilities and limitations
are well understood. This may require significant time or training,
but the alternative is to take a major risk of a mistaken investment.
Return to top of this page's FAQ list
How can it be determined if a test environment is appropriate?
This is a difficult question in that it typically involves tradeoffs
between 'better' test environments and cost. The ultimate
situation would be a collection of test environments
that mimic exactly all possible hardware, software, network,
data, and usage characteristics of the expected live environments
in which the software will be used. For many software applications,
this would involve a nearly infinite number of variations, and
would clearly be impossible. And for new software applications,
it may also be impossible to predict all the variations in
environments in which the application will run. For very large,
complex systems, duplication of a 'live' type of environment
may be prohibitively expensive.
In reality judgements must be made as to which characteristics of
a software application environment are important, and test
environments can be selected on that basis after taking into account
time, budget, and logistical constraints. Such judgements
are preferably made by those who have the most appropriate technical
knowledge and experience, along with an understanding of risks
and constraints.
For smaller or low risk projects, an informal approach is
common, but for larger or higher risk projects (in terms
of money, property, or lives) a more formalized process
involving multiple personnel and significant effort and
expense may be appropriate.
In some situations it may be possible to mitigate the need for
maintenance of large numbers of varied test environments.
One approach might be to coordinate internal testing with beta testing
efforts. Another possible mitigation approach is to provide built-in
automated tests that run automatically upon installation of
the application by end-users. These tests might then automatically
report back information, via the internet, about the application
environment and problems encountered.
Return to top of this page's FAQ list
What's the best approach to software test estimation?
There is no simple answer for this. The 'best approach' is highly
dependent on the particular organization and project and the experience
of the personnel involved.
For example, given two software projects of similar complexity and
size, the appropriate test effort for one project might be
very large if it was for life-critical medical equipment software,
but might be much smaller for the other project if it was for
a low-cost computer game. A test estimation approach that only
considered size and complexity might be appropriate for one
project but not for the other.
Following are some approaches to consider.
Implicit Risk Context Approach:
A typical approach to test estimation is for a project manager
or QA manager to implicitly use risk context, in combination
with past personal experiences in the organization, to
choose a level of resources to allocate to testing.
In many organizations, the 'risk context' is assumed to be
similar from one project to the next, so there is no
explicit consideration of risk context. (Risk context
might include factors such as the organization's typical
software quality levels, the software's intended use,
the experience level of developers and testers, etc.) This
is essentially an intuitive guess based on experience.
Metrics-Based Approach:
A useful approach is to track past experience of an organization's
various projects and the associated test effort that worked well
for projects. Once there is a set of data covering
characteristics for a reasonable number of projects, then
this 'past experience' information can be used for future test
project planning. (Determining and collecting useful project
metrics over time can be an extremely difficult task.)
For each particular new project, the 'expected'
required test time can be adjusted based on whatever
metrics or other information is available, such as function
point count, number of external system interfaces, unit testing
done by developers, risk levels of the project, etc. In
the end, this is essentially 'judgement based
on documented experience', and is not easy to do successfully.
Test Work Breakdown Approach:
Another common approach is to decompose the expected testing tasks
into a collection of small tasks for which estimates can, at
least in theory, be made with reasonable accuracy. This of
course assumes that an accurate and predictable breakdown of testing
tasks and their estimated effort is feasible. In many large projects,
this is not the case. For example, if a large number of bugs
are being found in a project, this will add to the time required for
testing, retesting, bug analysis and reporting. It will also
add to the time required for development, and if development schedules and
efforts do not go as planned, this will further impact testing.
Iterative Approach:
In this approach for large test efforts, an initial rough testing
estimate is made. Once testing begins, a more refined estimate
is made after a small percentage (eg, 1%) of the first estimate's
work is done. At this point testers have obtained additional
test project knowledge and a better understanding of issues, general
software quality, and risk. Test plans and schedules can be
refactored if necessary and a new estimate provided. Then a
yet-more-refined estimate is made after a somewhat larger percentage
(eg, 2%) of the new work estimate is done. Repeat the cycle as
necessary/appropriate.
Percentage-of-Development Approach:
Some organizations utilize a quick estimation method for testing
based on the estimated programming effort. For example, if a
project is estimated to require 1000 hours of programming effort,
and the organization normally finds that a 40% ratio for testing
is appropriate, then an estimate of 400 hours for testing would
be used. This approach may or may not be useful depending on
the project-to-project variations in risk, personnel, types
of applications, levels of complexity, etc.
Successful test estimation is a challenge for most organizations,
since few can accurately estimate software project development
efforts, much less the testing effort of a project.
It is also difficult to attempt testing
estimates without first having detailed information
about a project, including detailed requirements,
the organization's experience with similar projects in the past,
and an understanding of what should be included in a 'testing'
estimation for a project (functional testing?
unit testing? reviews? inspections? load testing?
security testing?)
With agile software development approaches, test effort
estimations may be unnecessary if pure test-driven
development is utilized. In general, agile-based projects
by their nature will not be heavily dependent on large testing
efforts, since they emphasize the construction of
releasable software in very short iteration cycles. Therefore
test effort estimates may not be as difficult and the impact
of inaccurate estimates will be minimized.
For an interesting view of the problem of test estimation,
see the comments on
Martin Fowler's web site indicating that, for
many large systems, "testing and debugging is impossible to schedule".
Return to top of this page's FAQ list
|