6633FM.qxd 4/3/06 1:54 PM Page i
.NET Test Automation
Recipes
A Problem-Solution Approach
James D. McCaffrey
6633FM.qxd 4/3/06 1:54 PM Page ii
.NET Test Automation Recipes: A Problem-Solution Approach
Copyright © 2006 by James D. McCaffrey
All rights reserved. No part of this work may be reproduced or transmitted in any form or by any means,
electronic or mechanical, including photocopying, recording, or by any information storage or retrieval
system, without the prior written permission of the copyright owner and the publisher.
ISBN-13: 978-1-59059-663-0
ISBN-10: 1-59059-663-3
Printed and bound in the United States of America 9 8 7 6 5 4 3 2 1
Trademarked names may appear in this book. Rather than use a trademark symbol with every occurrence
of a trademarked name, we use the names only in an editorial fashion and to the benefit of the trademark
owner, with no intention of infringement of the trademark.
Lead Editor: Jonathan Hassell
Technical Reviewer: Josh Kelling
Editorial Board: Steve Anglin, Ewan Buckingham, Gary Cornell, Jason Gilmore, Jonathan Gennick,
Jonathan Hassell, James Huddleston, Chris Mills, Matthew Moodie, Dominic Shakeshaft, Jim Sumser,
Keir Thomas, Matt Wade
Project Manager: Elizabeth Seymour
Copy Edit Manager: Nicole LeClerc
Copy Editor: Julie McNamee
Assistant Production Director: Kari Brooks-Copony
Production Editor: Katie Stence
Compositor: Lynn L’Heureux
Proofreader: Elizabeth Berry
Indexer: Becky Hornak
Cover Designer: Kurt Krames
Manufacturing Director: Tom Debolski
Distributed to the book trade worldwide by Springer-Verlag New York, Inc., 233 Spring Street, 6th Floor,
New York, NY 10013. Phone 1-800-SPRINGER, fax 201-348-4505, e-mail orders-ny@springer-sbm.com, or
visit http://www.springeronline.com.
For information on translations, please contact Apress directly at 2560 Ninth Street, Suite 219, Berkeley,
CA 94710. Phone 510-549-5930, fax 510-549-5939, e-mail info@apress.com, or visit http://www.apress.com.
The information in this book is distributed on an “as is” basis, without warranty. Although every precau-
tion has been taken in the preparation of this work, neither the author(s) nor Apress shall have any
liability to any person or entity with respect to any loss or damage caused or alleged to be caused directly
or indirectly by the information contained in this work.
The source code for this book is available to readers at http://www.apress.com in the Source Code section.
6633FM.qxd 4/3/06 1:54 PM Page iii
6633FM.qxd 4/3/06 1:54 PM Page iv
6633FM.qxd 4/3/06 1:54 PM Page v
Contents at a Glance
About the Author . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xiii
About the Technical Reviewer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xv
Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xvii
Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xix
API Testing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
■ CHAPTER 1
Reflection-Based UI Testing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
■ CHAPTER 2
■ CHAPTER 3 Windows-Based UI Testing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
Test Harness Design Patterns . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
■ CHAPTER 4
Request-Response Testing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
■ CHAPTER 5
Script-Based Web UI Testing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167
■ CHAPTER 6
Low-Level Web UI Testing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185
■ CHAPTER 7
■ CHAPTER 8 Web Services Testing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207
SQL Stored Procedure Testing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237
■ CHAPTER 9
■ CHAPTER 10 Combinations and Permutations . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265
■ CHAPTER 11 ADO.NET Testing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 301
■ CHAPTER 12 XML Testing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335
INDEX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 365
v
■
6633FM.qxd 4/3/06 1:54 PM Page vi
6633FM.qxd 4/3/06 1:54 PM Page vii
Contents
About the Author . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xiii
About the Technical Reviewer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xv
Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xvii
Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xix
PART 1 ■ ■ ■ Windows Application Testing
■ CHAPTER 1
API Testing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.0 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.1 Storing Test Case Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
1.2 Reading Test Case Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.3 Parsing a Test Case . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
1.4 Converting Data to an Appropriate Data Type . . . . . . . . . . . . . . . . . . . . . 9
1.5 Determining a Test Case Result
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
1.6 Logging Test Case Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.7 Time-Stamping Test Case Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
1.8 Calculating Summary Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
1.9 Determining a Test Run Total Elapsed Time . . . . . . . . . . . . . . . . . . . . . 19
1.10 Dealing with null Input/null Expected Results . . . . . . . . . . . . . . . . . . 20
1.11 Dealing with Methods that Throw Exceptions . . . . . . . . . . . . . . . . . . 22
1.12 Dealing with Empty String Input Arguments . . . . . . . . . . . . . . . . . . . . 24
1.13 Programmatically Sending E-mail Alerts on Test Case Failures . . . 26
1.14 Launching a Test Harness Automatically . . . . . . . . . . . . . . . . . . . . . . . 28
1.15 Example Program: ApiTest . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
vii