Dedication v Preface xii Acknowledgments xiv About the Author xiv 1 About Software Testing and Unit Testing 1 What Is Software Testing For? 1 Who Should Test Software? 2 When Should Software Be Tested? 6 Examples of Testing Practices 7 Where Does Unit Testing Fit In? 7 What Does This Mean for iOS Developers? 11 2 Techniques for Test-Driven Development 13 Test First 13 Red, Green, Refactor 15 Designing a Test-Driven App 18 More on Refactoring 19 Ya Ain''t Gonna Need It 19 Testing Before, During, and After Coding 21 3 How to Write a Unit Test 23 The Requirement 23 Running Code with Known Input 24 Seeing Expected Results 26 Verifying the Results 26 Making the Tests More Readable 28 Organizing Multiple Tests 29 Refactoring 32 Summary 34 4 Tools for Testing 35 OCUnit with Xcode 35 Alternatives to OCUnit 46 Google Toolkit for Mac 46 GHUnit 47 CATCH 48 OCMock 50 Continuous Integration 52 Hudson 53 CruiseControl 57 Summary 58 5 Test-Driven Development of an iOS App 59 Product Goal 59 Use Cases 60 Plan of Attack 63 Getting Started 64 6 The Data Model 67 Topics 67 Questions 73 People 75 Connecting Questions to Other Classes 76 Answers 81 7 Application Logic 87 Plan of Attack 87 Creating a Question 88 Building Questions from JSON 102 8 Networking Code 113 NSURLConnection Class Design 113 StackOverflowCommunicator Implementation 114 Conclusion 125 9 View Controllers 127 Class Organization 127 The View Controller Class 128 TopicTableDataSource and TopicTableDelegate 133 Telling the View Controller to Create a New View Controller 149 The Question List Data Source 158 Where Next 170 10 Putting It All Together 171 Completing the Application''s Workflow 171 Displaying User Avatars 185 Finishing Off and Tidying Up 189 Ship It! 199 11 Designing for Test-Driven Development 201 Design to Interfaces, Not Implementations 201 Tell, Don''t Ask 203 Small, Focused Classes and Methods 204 Encapsulation 205 Use Is Better Than Reuse 205 Testing Concurrent Code 206 Don''t Be Cleverer Than Necessary 207 Prefer a Wide, Shallow Inheritance Hierarchy 208 Conclusion 208 12 Applying Test-Driven Development to an Existing Project 209 The Most Important Test You''ll Write Is the First 209 Refactoring to Support Testing 210 Testing to Support Refactoring 212 Do I Really Need to Write All These Tests? 213 13 Beyond Today''s Test-Driven Development 215 Expressing Ranges of Input and Output 215 Behavior-Driven Development 216 Automatic Test Case Generation 217 Automatically Creating Code to Pass Tests 219 Conclusion 220 Index 221.
Test-Driven IOS Development