Case Study of Testing a Distributed Internet-...
Transcript of Case Study of Testing a Distributed Internet-...
![Page 1: Case Study of Testing a Distributed Internet- Systempeople.apache.org/~sgoeschl/publications/case... · reengineering tasks are depicted in Figure 1. Figure 1 ‐ Architecture Overview](https://reader034.fdocuments.us/reader034/viewer/2022042221/5ec78cae004f0f36b66d3b19/html5/thumbnails/1.jpg)
Case Study of Testing a Distributed Internet-
System
by
DISiegfriedGOESCHLITServGmbH,A‐1120Vienna,AUSTRIA
Email:[email protected]
&
HarryM.SNEEDSoftwareDatenService,A‐1200Vienna,AUSTRIA
Email:harry.sneed@t‐online.de
Abstract This paper describes the testing strategy, methods and tools used for testing a
distributed financial services system on the Internet with CORBA interfaces for
handling a high volume of queries to a relational database. The new system
architecturewasderivedbyreengineeringapreviousmorelimitedapplication.The
paperstartswithanoutlineofthesoftwarearchitecture, thetestingrequirements
andthetestingstrategy.Itthengoesontodescribethetoolsusedintheprojectand
theresultsachieved.FortheprojectagenericC++integrationtestframeworkwas
developed especially for testing distributed components. This tool is described in
detail. The paper ends with a discussion of the discovered defects and their
distribution.
Keywords: Unit Testing, API Testing, Interface Test Drivers, Message Generation,
InterfaceValidation,RegressionTesting
![Page 2: Case Study of Testing a Distributed Internet- Systempeople.apache.org/~sgoeschl/publications/case... · reengineering tasks are depicted in Figure 1. Figure 1 ‐ Architecture Overview](https://reader034.fdocuments.us/reader034/viewer/2022042221/5ec78cae004f0f36b66d3b19/html5/thumbnails/2.jpg)
1 Introduction
Ontheonehand,thereisagenerallackofadequatetoolsfortestingdistributedsystems.
On the other hand, there is a great need for such tools, especially in light of the effort
requiredfortestingsuchsystems.Ithasbeennotedthattestingtakesatleastonehalfof
theeffortrequiredtodevelopobject‐oriented,distributedsystems.[Binder94a]
Thespecialproblemsinvolvedinverifyingandvalidatingdistributedsoftwarehavebeen
addressedintheappropriateliterature[Bourne97].Therearenotonlymultiplenodesofa
networkwithanexponentialnumberof interconnections,butalsomultiplearchitectural
layerstobetested.Thisraisestestcoststoanevenhigherlevel.Inaddition,therearefour
distinctlevelsoftestingtobedone:
• Moduleorclasstesting,oftendoneasWhite‐Boxtesting,
• Integrationtesting,oftendoneasGrey‐Boxtesting,
• Systemtesting,oftendoneasBlack‐Boxtesting,and
• Acceptancetesting
Thetestingofindividualclassescanbehandledwiththehelpofexistingcommercialunit
test tools. System testing can also be done using conventional capture/replay and
databaseeditingtools[Beizer95].Acceptancetestingrepresentsagreaterchallengeinthe
case of distributed systems, but it is not critical if the other tests have been performed
well.Thegreatestchallengeisthatofintegrationtesting.Distributedsystemsconsistofa
largenumberofinteractingcomponentsexecutingindiverseenvironmentswithcomplex
interfaces. These interactions and their interfaces have to be verified and validated by
integrationtestingsinceneitherunitnorsystemtestingsufficesforthispurpose.Theonly
way to accomplish this in an effective and efficient manner is via automated tests. As
pointed out by Graham and Fewster [FewGra99], test tools may not replace human
intelligenceintesting,butwithoutthemtestingcomplexsystemsatareasonablecostwill
neverbepossible.
The tool described in this paper grew out of an internet project in Great Britain in the
years 1998/99. The project combined web servers with distributed CORBA servers
(Common Object Request Broker Architecture) and relational databases. The goal of the
projectwastoprovideclientsindifferentpartsoftheworldwithrapidaccesstofinancial
data. The standard queries needed to be processedwithin seconds on relational tables
withseveralmillionentries.
The project in questionwas actually a reengineering project since the basic application
had already existed in the form of two different server systems providing access to a
Sybasedatabase.OneoftheseserversystemswasprogrammedinStandardC,theotherin
the4thGeneration languageFORTE©.The resultsof thequeriesweredeliveredasSGML
formats (Standard Generalized Markup Language). However, this original solution had
reacheditslimits.Itwasbecomingincreasinglyslowandunreliableundertheincreasing
load of the clients. Therefore, as often happens with quick‐and‐dirty solutions,
managementdecidedtoreengineerthesystem,re‐implementingthecriticaltransactions
in C++ with a new CORBA server for fastermessage distribution and a separate SGML
front‐end to transform the data into SGML. At the same time the web server
implementation and the database layoutwere reengineered to increase the throughput
and maintainability of application by independent teams located in London and
Washington.
![Page 3: Case Study of Testing a Distributed Internet- Systempeople.apache.org/~sgoeschl/publications/case... · reengineering tasks are depicted in Figure 1. Figure 1 ‐ Architecture Overview](https://reader034.fdocuments.us/reader034/viewer/2022042221/5ec78cae004f0f36b66d3b19/html5/thumbnails/3.jpg)
The project team chose a staged delivery lifecycle strategy with the option to use the
existing server implementation as a fallback. In the case of catastrophic production
problems the new CORBA‐based servers could have been activated or deactivated by
modifying a single configuration file. The resulting architecture and concurrent
reengineeringtasksaredepictedinFigure1.
Figure1‐ArchitectureOverview
ThewebserverreceivesHTTP(HyperTextTransportProtocol)requests,convertsthemto
the SGML requests and dispatches them to the appropriate server depending on the
request types defined by a configuration file. The SGML server accepts SGML requests
from the web server and invokes one or more IDL functions (Interface Definition
Language)on theCORBAServerusing IIOP (Interoperable InternetObjectProtocol).The
CORBAserverdelegatesthecallstoadatabaselayerwhichencapsulatesthebusinesslogic
andshieldstheserverfromchangestothedatabaselayout.
Thereengineeringprojectwassubjecttothefollowingconstraints:
• theprojectteamhadlittleexperienceusingaSYBASE©database
• the functionality to be reengineered in the first development increment was either
writteninCorFORTE©andconsistedofapproximately10000linesoflegacycode
• theoriginaldatabasealsohadtobereengineeredduetoperformanceproblems
• thewebserverimplementationwasrewritteninordertouseASP(ActiveServerPages)
insteadofin‐processPERLscripts(i.e.Fast‐CGI)
• the existingmonolithic, single‐entry API (Application Programming Interface) had to
replacedbyamodularIDLinterfacetoenablereuse
• developing a CORBA server in C++ is error‐prone since the developer bears
responsibilityforthememorymanagement
• theresultingproducthadtosupportmultipleplatforms(SOLARISandWindowsNT)
Inviewoftheseconstraints,testingwasassignedaparticularlyhighvaluefromthestart.
Itwasdecidedtocommitat leasthalfoftheprojectresourcestotesting, toplanthetest
carefully, to make a test plan in accordance with prevailing standards, and to develop
appropriate test tools for executing the tests. The project should be test driven in
accordance with the recommendations of Hetzel, Beizer, Binder and others [Hetzel88],
![Page 4: Case Study of Testing a Distributed Internet- Systempeople.apache.org/~sgoeschl/publications/case... · reengineering tasks are depicted in Figure 1. Figure 1 ‐ Architecture Overview](https://reader034.fdocuments.us/reader034/viewer/2022042221/5ec78cae004f0f36b66d3b19/html5/thumbnails/4.jpg)
[Beizer95],[Binder99].Itwasmainlyduetothisemphasisontestingthattheprojectcame
to a successful conclusion.Without the aid of automated test tools embedded in awell‐
definedtestprocessasdescribedbyKoomenandPohl[KoomenPol99],theprojectcould
neverhavebeencompletedontime.
2 Test Strategy
Inplanningthetesting,thefollowingrequirementshadtobeconsidered:
• ensure that the SGML server is fully backward compatible with the existing C and
FORTEserverimplementation
• ensurethatthenewsystemhasabetteraverageresponse
• ensurethatthenewsystemisreliableandstableunderhighload
• ensurethatthetestscanberunonmultipleplatforms
Altogether,therewerethreelayersofsoftwaretobetestedfirst individuallyandthenin
conjunctionwithoneanother.
• SGMLServer
• CORBAServer
• DatabaseAccessLayer
Using a bottom‐up test strategy, the architectural layers were to be tested in reverse
order, startingwith thedatabase access layer andworkingup to the client as shown in
Figure2.
Figure2‐BottomUpTestingStrategy
2.1 Database Access Layer Test
Totestthedatabaseaccesslayeritwasdecidedtocreatearegressiontestsuitewrittenin
C++ to compensate for the lack of SYBASE experience and to test the changes in the
databaseschema.Thisregressiontestalsoprovidedawaytobenchmarkvariousqueries
![Page 5: Case Study of Testing a Distributed Internet- Systempeople.apache.org/~sgoeschl/publications/case... · reengineering tasks are depicted in Figure 1. Figure 1 ‐ Architecture Overview](https://reader034.fdocuments.us/reader034/viewer/2022042221/5ec78cae004f0f36b66d3b19/html5/thumbnails/5.jpg)
againstthedatabase.Sincethereweremultiplewaysofaccessingthesamedata,thiswas
importantforrecordingandcomparingresults.
2.2 CORBA Server Test
To test the CORBA server, it was decided to implement a proxy client application to
generaterequeststotheserver.Thisproxyclientshouldsimulatethebehaviorofa later
realclient ingeneratingallkindsofrequests inanyorder.The focus for this testwas to
provetheabsenceofmemoryleaksandtotestthereliabilityoftheORB(ObjectRequest
Broker)underhighload.
2.3 SGML Server Test
To test theSGMLServer itwasdecided to create a regression test suite and run itwith
manually created requests in accordance with the API specification as well as with
hundreds of real‐life requests from theproduction system.The requests extracted from
productionservedtorepresenttheexistingoperationalprofile.Therequestsderivedfrom
thespecificationservedtorepresenttheexistingandnewrequirements.
3 Test Toolbox
Tofacilitatetesting,asetoftoolswasusedconsistingof:
• AssertionPackage–anindustrialstrengthassertionpackage
• LogfileViewer–atoolformonitoringmultiplelogfiles
• C++UnitTestFramework–aunitandintegrationtestframeworkforC++
• PERLRegressionTestFramework–anintegrationandsystemtestframework
Eachofthesetoolswillnowbeconsideredinturn.
3.1 Assertion Package
Meyer’sDesignbyContract[Mey97]isanimportantconceptforsoftwaredevelopersand
reduces the time spent during debugging significantly. It requires the programmers to
formulate preconditions on the states their inputs should have when they start and
postconditions on the states their outputs should havewhen they are finished. Besides,
invariantassertionscanbepostulatedonthestateofobjects,whichshouldnotchange.
The standard assertion function in the C Runtime Library is not useful in a production
environment because it prints an error message and terminates the program, which is
exactlynot thebehavioryouwould like tohave ina clientor server test. ImagineaGUI
application where the assertion function prints an error message to an invisible error
console or a serverwhich suddenly terminates. The standard assertion function is only
intendedforlocalmoduletesting.
![Page 6: Case Study of Testing a Distributed Internet- Systempeople.apache.org/~sgoeschl/publications/case... · reengineering tasks are depicted in Figure 1. Figure 1 ‐ Architecture Overview](https://reader034.fdocuments.us/reader034/viewer/2022042221/5ec78cae004f0f36b66d3b19/html5/thumbnails/6.jpg)
For this reason, it was decided to implement an assertion package with the following
functionality:
• JustInTimeDebuggingSupportonWindowsNT
• customizablebehavior
• selectiveactivationoftheassertions.
3.1.1 Just In Time Debugging
The idea of just in time debugging is borrowed from the Microsoft Foundation Class1
(MFC) assertion package, which starts a debugger whenever a failed assertion is
encountered. Ithas turnedout that this feature isextremelyvaluable fordebuggingand
testing. It is important to know whether one’s program terminated because of some
addressingerrororbecauseofaviolatedinvariant.Inthelattercase,onecaninvestigate
thecallstacktopinpointthereasonwhytheinvariantwasviolated.
3.1.2 Customizable Behavior
An industrial strength assertion package has to be flexible to meet the following
requirements:
• loganerrormessage
• sendanSNMP(SimpleNetworkManagementProtocol)alerttoamanagementconsole
• sendamailtothesystemadministrator
• throwanexceptioninsteadofterminatingtheprogram.
This flexibility could be achieved by implementing a Chain of Responsibility [GoF95]
where the system under test can register various assertion handlers. Each assertion
handlerisresponsibleforprovidingacertainleveloffunctionalitybeforeitdelegatesthe
assertiontothenexthandler.
3.2 Logfile Viewer
UnderWindowsNTtheeditorsusedtoviewalogfilehaveseveralshortcomings:
• someprogramstrytolockthelogfileexclusively
• hardlyanyprogramupdatestheviewofthelogfileautomatically
• oneneedsafiltertoviewlargelogfiles
• onemayneedtoviewmultiplelogfilessimultaneously
Therefore, itwas necessary to develop a customised logfile viewer explicitly for testing
client/servertypeapplicationswhichwouldnothavesuchlimitations.
1MFCisaC++GUIframeworkfortheWindowsenvironment
![Page 7: Case Study of Testing a Distributed Internet- Systempeople.apache.org/~sgoeschl/publications/case... · reengineering tasks are depicted in Figure 1. Figure 1 ‐ Architecture Overview](https://reader034.fdocuments.us/reader034/viewer/2022042221/5ec78cae004f0f36b66d3b19/html5/thumbnails/7.jpg)
3.3 C++ Unit Test Framework
Experiencehasproventhatitpaysofftocreateandmaintainformalunittestsaspartof
thesoftwaredevelopmentcycle[Wie96].Usuallyasoftwaredeveloperwritesatestdriver
forhis/herunitofwork,butthattestdriveronlyensuresthatthesoftwaredoesn’tcrash
duringthefirstexecution.Typicallyitconsistsofa“main”routineandafewstatementsto
print the results. Later the testdriver isneglected so that it no longer fitswith theunit
undertestandmightnotevencompile.Atthisstageeverybodyhasabandonedunittesting
and it becomes costly to maintain the software because there is no cheap way to
reproduceindividualunittests.
Thisdilemmaiswellknownandthequestionalwaysariseswhysoftwaredevelopersdon’t
createaproperunittest.Usuallythereareseveralanswers:
• “it’stoodifficulttotestthisunitseparately...”
• “thereisnotenoughcodetojustifyaunittest...”
• “Idon’thaveenoughtime...”
• “Idon’tknowhowtowriteaunittest...”
Thepoint tobestressedhere is thatallof theseobjectionsarevalid toa certaindegree
sincemostsoftwaredevelopersarereasonablepersons.Theanswersdonolongermake
senseifaunittestframeworkfulfillsthefollowingrequirements:
• thereisaunittestframeworkavailable
• ittakesasmuchtimetocreateaproperunittestasto“hack”athrow‐awaytestdriver
• one getsmore “bang for the buck”2 as a software developer and thismakes it more
difficulttoneglectunittesting
The advantages of using a reusable unit test framework instead of a throw‐away test
driverareobvious.Thetestframeworksupports:
• detectionofmemoryleaks
• performancemeasurements
• stresstesting
• testofmulti‐threadsafety
• simplemodificationoftestdata
• integrationofregressiontesting
• simplescripting
For these reasons and others, the project team decided to implement its own unit test
frameworkforC++tosatisfythespecialrequirementsofadistributedtest.Theresultwas
thetoolcalledAPITEST. Intheend, itwasusedinseveralprojectsbothonSOLARISand
WindowsNT.
3.3.1 Basic Concepts
Everyunittestcanbedividedintooneormoretestsuiteswithauniquename.Everytest
suitecancontainoneormoretestcases,whichisrepresentedinFigure3.Everytestcase
isuniquelyidentifiedthroughanumberwithinatestsuite.
2„Getmorebangforthebuck“wasthemanager’soriginalstatementaboutmakingaprocessmore
effective
![Page 8: Case Study of Testing a Distributed Internet- Systempeople.apache.org/~sgoeschl/publications/case... · reengineering tasks are depicted in Figure 1. Figure 1 ‐ Architecture Overview](https://reader034.fdocuments.us/reader034/viewer/2022042221/5ec78cae004f0f36b66d3b19/html5/thumbnails/8.jpg)
Figure3‐RelationshipsbetweenUnitTest,TestSuitesandTestCases
Aninvocationofaparticulartestcasecanleadtooneofthefollowingresults:
• passed
• failed
• crashed
• obsolete
A test case fails if it does not fulfill all required post conditions of the test. A test case
crashes if an exception is propagatedout of the test case implementation.A test case is
obsoleteifitisnotusedanylonger[Sneed98].
Thecommandlineinterfaceallowsonetorunaunittestinmultipleways:
• runalltestsuites
• runoneparticulartestsuite
• runonetestcasewithinatestsuite
After execution of a unit test an execution summary is displayed. A typical example is
giveninFigure4.
Execution Summary
Test started : Tue Oct 05 13:39:26 1999
Test finished : Tue Oct 05 13:39:26 1999
Test Executed : 6
Test Crashed : 0
Test Passed : 4
Test Failed : 1 Test Obsolete : 1
TEST 3 FAILED
CPU time (sec) : 1.0220000
Figure4‐TestReportofAPITEST
3.3.2 Detection of Memory Leaks
OneofthemostdifficultaspectsoftheprogramminglanguageC/C++whenmakinglarge‐
scale softwaredevelopment ismanualmemorymanagement.Therefore it is essential to
simplifythedetectionofmemoryleaks.
![Page 9: Case Study of Testing a Distributed Internet- Systempeople.apache.org/~sgoeschl/publications/case... · reengineering tasks are depicted in Figure 1. Figure 1 ‐ Architecture Overview](https://reader034.fdocuments.us/reader034/viewer/2022042221/5ec78cae004f0f36b66d3b19/html5/thumbnails/9.jpg)
Figure5‐IntegratingAPITESTwithPurify
APITEST provides close integration with PURIFY© from Rational (see Figure 5), a
commonly used tool for detecting memory leaks and related problems during
development. PURIFY tracks all memory and checks allocations of memory during
execution, but it turned out that the results were difficult to interpret due to the way
resources were allocated by initialization routines. It became necessary to execute test
cases repeatedly in order to obtain sensible results. APITESTprints statusmessages on
thePURIFYconsolebeforeexecutingatestcaseandreportstheallocatedresourcesafter
executingthetestcase.
In the absence of PURIFY it is possible to track resource consumptionmanually, but it
requiresmoretimetodetectsmallmemoryleaks.ThereforethecombinationofAPITEST
andPURIFYwasdeterminedtobethebestsolution.
3.3.3 Performance Measurements
The execution summary provides information about the time spent executing the test
cases. Formeaningful results it is necessary to execute testsmore thanonce, otherwise
resultsaredistortedbytheinitializationtime.
3.3.4 Stress Testing
For theserverdevelopment it isalsoessential to test thesystemunder full loadand/or
gatherperformancedatawithanincreasingload.Assumingthatthereisaunittestacting
asaclient it isconvenienttoreusetheunittestandtesttheserverwithmultipleclients
overa long time.APITEST facilitates thisbyprovidingcommand lineoptions toexecute
the tests multiple times with one or more threads. Furthermore a user‐defined wait
betweenexecutingtwotestcasesissupportedtosimulatethebehaviorofrealclients.
![Page 10: Case Study of Testing a Distributed Internet- Systempeople.apache.org/~sgoeschl/publications/case... · reengineering tasks are depicted in Figure 1. Figure 1 ‐ Architecture Overview](https://reader034.fdocuments.us/reader034/viewer/2022042221/5ec78cae004f0f36b66d3b19/html5/thumbnails/10.jpg)
3.3.5 Test of Multithread Safety
Executingaunit testwithmultiple threads is important forensuringthat theunitunder
testdoesn’tdeadlock itselfafterthefirstexecution.Usuallythesetestsareomittedsince
writingmultithreadedtestprogramsissignificantlymorework.APITESTfacilitatesthese
testsbyitsabilitytodefinethenumberofexecutingthreadsonthecommandline.Inthis
case the unit test is executed by multiple threads simultaneously. Furthermore, it is
possible to randomize the order in which test cases are executed for every thread to
simulate the behavior of real clients. Passing this test does not guarantee that the unit
undertestismultithread‐safe,butitdoesgiveagoodindicationthatitperformsproperly
inamulti‐threadedenvironment.
3.3.6 Simple Modification of Test Data
Athrow‐awaytestdrivertendstohardcodetherequiredtestdata,thuscomplicatingthe
migrationtoanewtestenvironment,e.g.anewdatabaseforintegrationtesting.Toavoid
this complication it is necessary to provide an easy way to access test data. This is
accomplishedbyprovidingconfigurationfilesupportasshownforexampleinFigure6.
dbtest.1.branch_code=14000
dbtest.1.customer_id=730875734
Figure6‐testdataconfiguration
Eachentry intheconfigurationfileconsistsofakeyandavalue.Thekeyconsistsof the
testsuitename,thetestcasenumberandthenameofthevariable.
3.3.7 Integration of Regression Testing
When testing amodule for accessing a database, a unit test typically doesn’t verify the
result apart from checking certain assumptions (e.g. there must be some results or a
certain field can’t be null). APITEST provides the notion of a verbosemode to produce
detailed output either written to the console or into a file. This verbose output can be
capturedandexplicitlycomparedwithareferencetodetectanydifferencesbetweentest
runs(see3.4.PerlRegressionTestFrameworklater)
AdditionallyAPITESTenableseachworkerthreadtouseitsownoutputfilewhichallows
forafurthercheckofmulti‐threadsafety.Eachworkerthreadexecutesthesametestsand
should produce the exactly the same output file. Any difference of the resulting output
mightindicatearacecondition.
3.3.9. Simple Scripting
Therewillalwaysbeacoupleofbrokentestswhichdonotneedtobeexecutedeverytime,
e.g.aquickregressiontestrunbyadeveloperaftercodechanges.Specifyingalltestcases
and/ortestsuiteswhichshouldbeexecutedbyascriptprovidesasolution.Thescriptfile
isthendrivenbythecommandlineoptions.
![Page 11: Case Study of Testing a Distributed Internet- Systempeople.apache.org/~sgoeschl/publications/case... · reengineering tasks are depicted in Figure 1. Figure 1 ‐ Architecture Overview](https://reader034.fdocuments.us/reader034/viewer/2022042221/5ec78cae004f0f36b66d3b19/html5/thumbnails/11.jpg)
3.3.10. Command Line Options
TheunittestframeworksupportsthefollowingcommandlineoptionsasshowninTable
1.
Command Line Option Description
-C file Name of test configuration file
-F file Script file with tests to execute
-I Ignore failed tests
-M threads Number of executing threads
-R Random shuffle test sequence for each thread
-S testsuite [-T testcase]] Test(s) to execute
-O filename Name of output file
-V Enable verbose output
-W ms Time to wait between two test cases
-X repeats Number of repetitions
Table1‐CommandlineoptionsforAPITEST
3.4. Perl Regression Test Framework
DROPTEST isaPerl regression test frameworkdevelopedbyWild [Wild97]. Ithasbeen
used in slightlymodified form inmanyprojectsunderWindows95,WindowsNT, SINIX,
AIXandSOLARIS.
ItwasdecidedtoimplementaregressiontestsuitefortheSGMLServertoprovethatits
behaviorwas equivalent to that of the replaced components.Onepart of the regression
testsuitewasdraftedaccordingtothespecification.Theotherpartconsistedofmorethan
200real‐liferequestsfromtheproductionsystemtocoveranyunspecifiedbehavior.
3.4.2. Basic Concepts
ThefunctionalityofDROPTESTisbasedonthedirectorystructureshowninFigure7
Figure7‐DROPTESTdirectorystructure
![Page 12: Case Study of Testing a Distributed Internet- Systempeople.apache.org/~sgoeschl/publications/case... · reengineering tasks are depicted in Figure 1. Figure 1 ‐ Architecture Overview](https://reader034.fdocuments.us/reader034/viewer/2022042221/5ec78cae004f0f36b66d3b19/html5/thumbnails/12.jpg)
The main idea is to drop a regression test into the TEST directory (hence the name
DROPTEST)ThePerlscriptcheckseveryfilefoundinTESTifthereisacorrespondingfile
inPREand/orPOSTandexecutestheminthefollowingorder:
• PREstep(optional)
• TESTstep(mandatory)
• POSTstep(optional)
In thismannerthescriptprovidesanoptionalpreandpoststep,whichcanperformthe
followingtasks:
• copyconfigurationinformation
• deletetemporaryfiles
• killleft‐overprocesses
Thebasic idea is that every test stepproduces some sort of reproducible output.A test
stepisconsideredsuccessfulifthecurrentoutputisidenticaltoareferenceoutputstored
inthereferencedirectory.Ateststepisregardedasunsuccessfulifthecurrentoutputis
differentfromthereferenceoutput.
3.4.3. SGML Server Regression Testing
The regression testwas executedwith a copy of the real production database andwas
updated daily. Under these circumstances the regression test depended heavily on the
easeofcreatingnewreferencedata.Thiswasaccomplishedbyrunningtheregressiontest
againsttheoriginalserverwritteninCorFORTEtogeneratethereferencedata.
The SGML Server was tested with a PERL Script sending SGML requests to the SGML
Server. This PERL scriptwas invoked as the actual test step of DROPTEST and read an
inputdatafileasshowninFigure8.
REQUEST=COMBINED_SEARCH
USERID=ROWJ
COM_FILER_NAME_SEGMENT=LEPCO
COM_COMPANY_NR=L420000000
OUT_SORT_KEY_2=DOC_TYPE
OUT_TYPE=D
OUT_SORT_ORDER_1=D
FILTER_INSIDER_DOCS=Y
OUT_SORT_ORDER_2=A
SEC_ONLY=N
OUT_START_ROW=1
OUT_TOTAL_ROWS=Y
OUT_MAX_ROWS=25
OUT_SORT_KEY_1=DOC_DATETIME_ARRIV_MIN
Figure8‐SGMLrequestinputdataforretrievingfinancialdocuments
Inthepoststepcachingrelatedtagswereremovedfromtheresultandcomparedwiththe
reference files, by means of such automated comparison, deviations in the new results
couldbereadilydetected[Harrold98].
![Page 13: Case Study of Testing a Distributed Internet- Systempeople.apache.org/~sgoeschl/publications/case... · reengineering tasks are depicted in Figure 1. Figure 1 ‐ Architecture Overview](https://reader034.fdocuments.us/reader034/viewer/2022042221/5ec78cae004f0f36b66d3b19/html5/thumbnails/13.jpg)
4 Defect Distribution
Duringthefirstdevelopmentincrementandafourmonthtestingperiod4700statements
ofnewlydevelopedcode3and7400statementsofreusedin‐housecode(suchasaCORBA‐
basedapplicationframework)weretestedand151defectswerefound.Thedefectratein
thenewlywrittenpartoftheapplicationisatleast10timeshigherthaninthereusedcode
asshowninTable2,afindingconfirmedbyBasilietal. [Basili+96].Thedefectsfoundin
thereusedapplication frameworkresulted fromadifferentusageprofile,whichwasnot
covered by the existing regression test suite. This effect is described as the pesticide
paradoxbyBeizer[Beizer90]becausesomeresidualbugsarenotrevealedbytheexisting
regressiontestsuitebuttriggeredbythenewapplicationinstantiation.
LOC Defect Defect/KLOC
4700LOCnewcode 132 28.1
7400LOCreusedcode 19 2.6
Table2‐DefectsfoundinnewlywrittenandreusedC++code
ThediagramdepictedinFigure9showsthedefectsclassifiedbyseverity,andtoolssuch
as DROPTEST, APITEST, build process, manual testing and reviewing source code.
DROPTEST proved to be very effective due to the ease of creating new test cases by
reusingexistingtestdata.
Figure9‐DefectsperToolandSeverity
Furthermore the encountered defects could be classified as memory related problems
(memoryleaks,memoryaccessviolations,usingalreadyfreedmemory), implementation
relatedproblemsandSGMLrelatedproblems(formattingtheSGMLreplies,missingSGML
tags)asdepictedinFigure10.
3Thegeneratedcodeaccessingthedatabasetables(DBCompatibiltyLayer)wasnotcounted.
![Page 14: Case Study of Testing a Distributed Internet- Systempeople.apache.org/~sgoeschl/publications/case... · reengineering tasks are depicted in Figure 1. Figure 1 ‐ Architecture Overview](https://reader034.fdocuments.us/reader034/viewer/2022042221/5ec78cae004f0f36b66d3b19/html5/thumbnails/14.jpg)
Figure10‐DefectsperToolandDefectType
APITESTwasinvaluablefordetectingmemoryrelateddefects‐63%ofallmemoryrelated
defectswerediscoveredusingAPITESTsuchas:
• exceptionhandlingcodegeneratedbytheIDLcompiler
• memoryleakintheSYBASElibraries
• memoryleakandamultithread‐safetyproblemintheCORBAnamingservice
• memoryleakintheSNMPlibrary
TheindependentsystemtestgroupinWashingtonfoundthreedefectswhichweretraced
backtoaslightlydifferentsystemconfigurationregardingtheSOLARISoperatingsystem
andtheinstalledORB.
5 Conclusion
Testing often becomes the critical‐path activity on a software project because it is
postponed to the end of the software development process. With a test driven
development approach, unit and integration tests are developed in parallel with the
softwareandconsideredaspartofthesoftwarerelease.Ifdeveloperscreateandmaintain
testsfortheirwork,thesoftwarewillneverbeallowedtodisintegrate.Consequentlythese
testsareusedforaDailyBuildandSmokeTest[McCon96]inwhichasoftwareproductis
completely built every day and then put through a series of tests to verify its basic
operations.
The test driven development approach proved to be highly effective during the
incrementaldevelopment:
• theassertionpackagewithJust‐In‐Debuggingallowedpinpointingviolatedassertions
immediatelyusinganinteractivedebugger
• 63%of thememory relateddefects includingmemory leaks in commercial software
packageswerefoundbyusingAPITESTinconjunctionwithPURIFY
• usingDROPTESTwithSGMLtestdatasavedconsiderableeffortbyintegratingreal‐life
requestsfromtheproductionsystemandbyreusingtestdatatocreatenewtestcases
• the ease of generating an arbitrary load with APITEST under various conditions
encouragesdeveloperstodoperformancetestingofcomponentsataveryearlystage
ofdevelopmentwhichinturnincreasesthereliabilityofthefinalproduct.
![Page 15: Case Study of Testing a Distributed Internet- Systempeople.apache.org/~sgoeschl/publications/case... · reengineering tasks are depicted in Figure 1. Figure 1 ‐ Architecture Overview](https://reader034.fdocuments.us/reader034/viewer/2022042221/5ec78cae004f0f36b66d3b19/html5/thumbnails/15.jpg)
Thelayeredtestingapproachisessentialforefficientsoftwarecorrectioninadistributed
system. By “drilling down” the various layers of the software it is possible to pinpoint
problemsandtodebugtheoffendingcodeveryefficiently.The“drillingdown”startswith
a failed integration or system test case and involves executing, reviewing and finally
creating test cases for the software layers beneath. The intention is to pinpoint the
problem and to improve the existing test suites because a defect detected during
integrationtestingindicatesamissingunittestcase.
Allinall,itcanbeconcludedthattheuseofaunitandintegrationtestframeworktodetect
errors in the components and their interfaces as soon as the codewas compiledwas a
great advantage and contributed significantly to the low number of defects found in
system testingwhere they aremuchmore difficult to locate and remove.However, this
requiredthatthetestbedesignedintothesystemarchitecturefromthestart.Thisdesign
fortestabilityprovedtobeacriticalsuccessfactorintheoverallproject.[Binder94b].
![Page 16: Case Study of Testing a Distributed Internet- Systempeople.apache.org/~sgoeschl/publications/case... · reengineering tasks are depicted in Figure 1. Figure 1 ‐ Architecture Overview](https://reader034.fdocuments.us/reader034/viewer/2022042221/5ec78cae004f0f36b66d3b19/html5/thumbnails/16.jpg)
References
[Basilli+96] VictorR.Basili,LionelC.Briand,WalcélioL.Melo.Howreuseinfluencesproductivityin
object‐orientedsystems.CommunicationsoftheACM39(10):114‐116,October1996
[BeGa98] KentBeck,ErichGamma.TestinfectedprogrammerslovewritingTests.JavaReport,Vol.3,No.7,
July,1998,p.37‐50
[Beizer90] Beizer,Boris.SoftwareTestingTechniques.2ndEd.,VanNostrandReinhold,NewYork,
1990
[Beizer95] Beizer,Boris.Black‐BoxTesting.JohnWiley&Sons,NewYork,1995,p.236
[Binder94a] Binder,Robert.TestingObject‐OrientedSystems–AStatusReport”.American
Programmer,Vol.7,No.4,April1994,p.22
[Binder94b] Binder,Robert.DesignforTestabilityinObject‐OrientedSystems.Comm.OfACM,Vol.
37,No.9,Sept.1994,p.37
[Binder99] Binder,Robert.TestingObject‐OrientedSystems.Addison‐WesleyPub.,Reading,Mass.,
1999,p.58
[Bourne97] Bourne,Kelly.TestingClient/ServerSystems.McGraw‐Hill,NewYork,1997,p.19
[FewGra99] Fewster,Mark/Graham,Dot.SoftwareTestAutomation.Addison‐WesleyPub.,Harlow,
G.B.,1999,p.26
[GoF95] ErichGamma,RichardHelm,RalphJohnson,JohnVlissides.DesignPatterns–Elements
ofReusableObject‐OrientedSoftware.Addision‐WesleyProfessionalComputingSeries,
1995,p.223‐232
[Harrold98] Harrold,MaryJean/Rothermel,Gregg.EmpiricalStudiesofaSafeRegressionTest
SelectionTechnique.IEEETrans.onS.E.,Vol.24,No.6,June1998,p.401
[Hetzel88] Hetzel,Bill.TheCompleteGuidetoSoftwareTesting.QEDInformationSciences,
Wellesley,Mass.1988,p.73
[KoomPohl99] Koomen,Tim/Pohl,Martin.TestProcessImprovement.Addison‐WesleyPub.Harlow,
G.B.,1999,p.109
[McCon96] SteveMcConnell.RapidDevelopment.MicrosoftPress,1996,p.405‐414
[Mey97] BertrandMeyer.ObjectOrientedSoftwareConstruction.2ndEdition,Prentice‐HallInc.,
1997
![Page 17: Case Study of Testing a Distributed Internet- Systempeople.apache.org/~sgoeschl/publications/case... · reengineering tasks are depicted in Figure 1. Figure 1 ‐ Architecture Overview](https://reader034.fdocuments.us/reader034/viewer/2022042221/5ec78cae004f0f36b66d3b19/html5/thumbnails/17.jpg)
[Sneed98] Sneed,Harry:AutomatedTestCaseSpecificationforIntegrationTestingofDistributed
Objects.Proc.ofEuroStar98,QSEPub.,München,Dec.1998,p.137
[Wie96] KarlEugeneWiegers.CreatingaSoftwareEngineeringCulture.DorsetHousePublishing,
1996,p.93
[Wild97] FredWild.DesignforTestability,Dr.Dobb’sJournal,6/97,www.ddj.com