作者简介 Harry J.W.Percival,在PyhonAnywhere LLP工作,并带着全部激情和热忱在全球的演讲、培训和会议中传播测试驱动开发的福音。他持有利物浦大学的计算机科学硕士学位以及剑桥大学的哲学硕士学位。
目录 Prerequisites and Assumptions Companion Video Acknowledgments Part I.The Basics of TDD and Django 1.Getting Django Set Up Using a Functional Test Obey the Testing Goat! Do Nothing Until You Have a Test Getting Django Up and Running Starting a Git Repository 2.Extending Our Functional Test Using the unittest Module Using a Functional Test to Scope Out a Minimum Viable App The Python Standard Librarys unittest Module Implicit waits Commit 3.Testing a Simple Home Page with Unit Tests Our First Django App, and Our First Unit Test Unit Tests, and How They Differ from Functional Tests Unit Testing in Django Djangos MVC, URLs, and View Functions At Last! We Actually Write Some Application Code! urls.py Unit Testing a View The Unit—Test/Code Cycle 4.What Are We Doing with All These Tests? Programming Is like Pulling a Bucket of Water up from a Well Using Selenium to Test User Interactions The "Dont Test Constants" Rule, and Templates to the Rescue Refactoring to Use a Template On Refactoring A Little More of Our Front Page Recap: The TDD Process 5.Saving User Input Wiring Up Our Form to Send a POST Request Processing a POST Request on the Server Passing Python Variables to Be Rendered in the Template Three Strikes and Refactor The Django ORM and Our First Model Our First Database Migration The Test Gets Surprisingly Far A New Field Means a New Migration Saving the POST to the Database Redirect After a POST Better Unit Testing Practice: Each Test Should Test One Thing Rendering Items in the Template Creating Our Production Database with migrate 6.Getting to the Minimum Viable Site Ensuring Test Isolation in Functional Tests Running lust the Unit Tests Small Design When Necessary YAGNI! REST Implementing the New Design Using TDD Iterating Towards the New Design Testing Views, Templates, and URLs Together with the Django Test Client A New Test Class A New URL A New View Function A Separate Template for Viewing Lists Another URL and View for Adding List Items A Test Class for New List Creation A URL and View for New List Creation Removing Now—Redundant Code and Tests Pointing Our Forms at the New URL Adjusting Our Models A Foreign Key Relationship Adjusting the Rest of the World to Our New Models Each List Should Have Its Own URL Capturing Parameters from URLs Adjusting new_list to the New World One More View to Handle Adding Items to an Existing List Beware of Greedy Regular Expressions! The Last New URL The Last New View But How to Use That URL in the Form? A Final Refactor Using URL includes Part Ⅱ.Web Development Sine Qua Nons 7.Prettification: Layout and Styling, and What to Test About It What to Functionally Test About Layout and Style Pretti Fication: Using a CSS Framework Django Template Inheritance Integrating Bootstrap Rows and Columns Static Files in Django Switching to Static Live Server Test Case Using Bootstrap Components to Improve the Look of the Site Jumbotron! Large Inputs Table Styling Using Our Own CSS What We Glossed Over: collectstatic and Other Static Directories A Few Things That Didnt Make It 8.Testing Deployment Using a Staging Site TDD and the Danger Areas of Deployment As Always, Start with a Test Getting a Domain Name Manually Provisioning a Server to Host Our Site Choosing Where to Host Our Site Spinning Up a Server User Accounts, SSH, and Privileges Installing Nginx Configuring Domains for Staging and Live Using the FT to Confirm the Domain Works and Nginx Is Running Deploying Our Code Manually Adjusting the Database Location Creating a Virtualenv Simple Nginx Configuration Creating the Database with migrate Getting to a Production—Ready Deployment Switching to Gunicorn Getting Nginx to Serve Static Files Switching to Using Unix Sockets Switching DEBUG to False and Setting ALLOWED_HOSTS Using Upstart to Make Sure Gunicorn Starts on Boot Saving Our Changes: Adding Gunicorn to Our requirements.txt Automating "Saving Your Progress" 9.Automating Deployment with Fabric Breakdown of a Fabric Script for Our Deployment Trying It Out Deploying to Live Nginx and Gunicorn Config Using sed Git Tag the Release Further Reading 10.Input Validation and Test Organisation Validation FT: Preventing Blank Items Skipping a Test Splitting Functional Tests out into Many Files Running a Single Test File Fleshing Out the FT Using Model—Layer Validation Refactoring Unit Tests into Several Files Unit Testing Model Validation and the self assert Raises Context Manager A Django Quirk: Model Save Doesnt Run Validation Surfacing Model Validation Errors in the View Checking Invalid Input Isnt Saved to the Database Django Pattern: Processing POST Requests in the Same View as Renders the Form Refactor: Transferring the new_item Functionality into view_list Enforang Model Validation in view_list Refactor: Removing Hardcoded URLs The {% url %} Template Tag Using get_absolute_url for Redirects 11.A Simple Form Moving Validation Logic into a Form Exploring the Forms API with a Unit Test Switching to a Django Model Form Testing and Customising Form Validation Using the Form in Our Views Using the Form in a View with a GET Request A Big Find and Replace Using the Form in a View That Takes POST Requests Adapting the Unit Tests for the new_list View Using the Form in the.View Using the Form to Display Errors in the Template Using the Form in the Other View A Helper Method for Several Short Tests Using the Forms Own Save Method 12.More Advanced Forms Another FT for Duplicate Items Preventing Duplicates at the Model Layer A Little Digression on Queryset Ordering and String Representations Rewriting the Old Model Test Some Integrity Errors Do Show Up on Save Experimenting with Duplicate Item Validation at the Views Layer A More Complex Form to Handle Uniqueness Validation Using the Existing List Item Form in the List View 13.Dipping Our Toes, Very Tentatively, into Java Script Starting with an FT Setting Up a Basic Java Script Test Runner Usingi Query and the Fixtures Div Building a Java Script Unit Test for Our Desired Functionality Javascript Testing in the TDD Cycle Columbo Says: Onload Boilerplate and Namespacing A Few Things That Didnt Make It 14.Deploying Our New Code Staging Deploy Live Deploy What to Do If You See a Database Error Wrap—Up: git tag the New Release …… Part Ⅲ.More Advanced Topics Index
以下为对购买帮助不大的评价