blob: 8c6350b9f08ed989d0f218b6fc823927a9c9bb46 [file] [log] [blame]
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C/DTD XHTML 1.0 Strict//EN" "DTD/xhtml1-strict.dtd">
<!-- VERSION rmc:7.1.0 -->
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<!-- START NON-TRANSLATABLE -->
<title>\openup_basic\guidances\concepts\developer_testing.xmi</title>
</head>
<!-- WARNING: do not modify the generated comments in this file below this line. They are used as markers for the import process. -->
<body>
Element Name: developer_testing.xmi<br/><br/>
<!-- END NON-TRANSLATABLE -->
<br/><br/><br/>
<!-- START NON-TRANSLATABLE -->
Attribute: presentationName<br/><br/>
<!-- END NON-TRANSLATABLE -->
<!-- START:presentationName,_aFeZgJquEdukqcRKZBQN9w CRC: 302200055 -->Developer Testing<!-- END:presentationName,_aFeZgJquEdukqcRKZBQN9w -->
<br/><br/><br/>
<!-- START NON-TRANSLATABLE -->
Attribute: briefDescription<br/><br/>
<!-- END NON-TRANSLATABLE -->
<!-- START:briefDescription,_aFeZgJquEdukqcRKZBQN9w CRC: 3534768133 -->Developers regression test their code on a continuous basis to ensure that it works as expected.<!-- END:briefDescription,_aFeZgJquEdukqcRKZBQN9w -->
<br/><br/><br/>
<!-- START NON-TRANSLATABLE -->
Attribute: mainDescription<br/><br/>
<!-- END NON-TRANSLATABLE -->
<!-- START:mainDescription,-Ff1JwbrGt1laexkOB6ZM1Q CRC: 2975183953 --><p>
Developer testing is the act of regression testing source code by developers.&nbsp; This is sometimes called "unit
regression testing" but many developer tests go beyond unit testing to address integration testing instead.
</p>
<h3>
Testing Philosophies
</h3>
<p>
Here are some important philosophies with regard to developer&nbsp;testing:
</p>
<ol>
<li>
The goal is to find defects. Successful tests find bugs, but correcting the bugs&nbsp;falls into other areas.
</li>
<li>
Test&nbsp;early and often. The cost of change rises exponentially the longer it takes to find and then remove a
defect. The implication is that you want to test as early as possible (the earliest you could possibly test is
first, see <a class="elementLinkWithType"
href="./../../../openup_basic/guidances/concepts/test_first_design,_0Y6kUMlgEdmt3adZL5Dmdw.html"
guid="_0Y6kUMlgEdmt3adZL5Dmdw">Concept: Test-first Design</a>).
</li>
<li>
Testing builds confidence. Many people fear making a change to their code because they are afraid that they will
break it, but with a full test suite in place if you do break something you know you will detect it and then fix
it.
</li>
<li>
One test is worth a thousand opinions. You can&nbsp;say that your application works, but until you show the test
results&nbsp;you might&nbsp;not be believed.
</li>
<li>
Test to the risk. The riskier something is, the more it needs to be reviewed and tested. In other words you should
invest significant effort testing in the algorithm for estimating radiation doses but nowhere near as much effort
testing the "change font size" function of the same application.
</li>
<li>
You can validate all artifacts. You can test all your artifacts, not just your source code, although the focus of
this guidance is testing code.
</li>
</ol>
<h3>
Qualities of a Good Developer Test
</h3>
These are the qualities of&nbsp;a good developer test:
<ul class="noindent">
<li>
It runs fast.&nbsp;It has&nbsp;short setup, run time, and clean-up.
</li>
<li>
It runs in isolation. You should be able to reorder your tests.
</li>
<li>
It is understandable. Good tests have consistent and informative names and use data that makes them easy to read
and to understand.
</li>
<li>
It uses real data. E.g. Use copies of production data when appropriate, but remember that you'll also have to
create some specific "artificial" test data as well.
</li>
<li>
It is minimally cohesive. The test represents one step toward your overall goal. The test should address one and
one only issue.
</li>
</ul>
<h3>
Approaches for Test Setup
</h3>
<p>
To successfully run a test, the system must be in a known state.&nbsp; To do this you will need objects or components
in memory, rows in your database, etc.&nbsp;that you will test against.&nbsp; The easiest approach is to hardcode the
required data and the setup code within the test itself.&nbsp; The primary advantage&nbsp;is that all the information
that you need about the test is in one place and that the test is potentially self-sufficient.
</p>
<p>
Another approach is to define an external data set which&nbsp;is loaded into memory or into&nbsp;the database at the
beginning of&nbsp;the test run.&nbsp; There are several advantages to this approach:
</p>
<ul>
<li>
It decouples the test data from the test.&nbsp;
</li>
<li>
More than one test&nbsp;can use the same data set.&nbsp;
</li>
<li>
It is easy to modify and/or multiply the test data.&nbsp;
</li>
</ul>
<p>
There are some disadvantages to this approach:
</p>
<ul>
<li>
Increased complexity for maintaining the external data
</li>
<li>
Potential coupling between test cases.&nbsp; When&nbsp;they share a common test data bed it becomes very easy to
write tests&nbsp;that depend on other tests running first, thereby coupling them together.<br />
</li>
</ul>
<h3>
Coding for Testability
</h3>
<p>
Add&nbsp;<a class="elementLink"
href="./../../../openup_basic/guidances/termdefinitions/code_instrumentation,_JiqnEJt1EdutoZjlV3a4Lg.html"
guid="_JiqnEJt1EdutoZjlV3a4Lg">Code Instrumentation</a> for testing and debugging.&nbsp; Pay special attention to the
implementation of the observation/control points, such as critical functions or&nbsp;objects,&nbsp;as these aspects
might need special support that has to be implemented in the component under test.
</p>
<h3>
Reviewing Tests
</h3>
<p>
If a test will be long-lived, ask a person with less inside knowledge of the component to run it and check if there is
enough support information. Review it with other people within the development team and other interested parties as
needed.
</p><!-- END:mainDescription,-Ff1JwbrGt1laexkOB6ZM1Q -->
</body>
</html>