Siêu thị PDFTải ngay đi em, trời tối mất

Thư viện tri thức trực tuyến

Kho tài liệu với 50,000+ tài liệu học thuật

© 2023 Siêu thị PDF - Kho tài liệu học thuật hàng đầu Việt Nam

Testing Python
PREMIUM
Số trang
243
Kích thước
10.8 MB
Định dạng
PDF
Lượt xem
1536

Testing Python

Nội dung xem thử

Mô tả chi tiết

Testing Python®

Testing Python®

APPLYING UNIT TESTING, TDD, BDD,

AND ACCEPTANCE TESTING

David Sale

This edition first published 2014

© 2014 David Sale

Registered office

John Wiley & Sons Ltd, The Atrium, Southern Gate, Chichester, West Sussex, PO19 8SQ, United Kingdom

For details of our global editorial offices, for customer services and for information about how to apply for permission to

reuse the copyright material in this book please see our website at www.wiley.com.

The right of the author to be identified as the author of this work has been asserted in accordance with the Copyright,

Designs and Patents Act 1988.

All rights reserved. No part of this publication may be reproduced, stored in a retrieval system, or transmitted, in any form

or by any means, electronic, mechanical, photocopying, recording or otherwise, except as permitted by the UK Copyright,

Designs and Patents Act 1988, without the prior permission of the publisher.

Wiley also publishes its books in a variety of electronic formats. Some content that appears in print may not be available in

electronic books.

Designations used by companies to distinguish their products are often claimed as trademarks. All brand names and prod￾uct names used in this book are trade names, service marks, trademarks or registered trademarks of their respective own￾ers. The publisher is not associated with any product or vendor mentioned in this book. This publication is designed to

provide accurate and authoritative information in regard to the subject matter covered. It is sold on the understanding that

the publisher is not engaged in rendering professional services. If professional advice or other expert assistance is required,

the services of a competent professional should be sought.

Trademarks: Wiley and the Wiley logo are trademarks or registered trademarks of John Wiley & Sons, Inc. and/or its

affiliates in the United States and/or other countries, and may not be used without written permission. Python is a regis￾tered trademark of the Python Software Foundation. All other trademarks are the property of their respective owners. John

Wiley & Sons, Ltd. is not associated with any product or vendor mentioned in the book.

A catalogue record for this book is available from the British Library.

ISBN 978-1-118-90122-9 (paperback); ISBN 978-1-118-90124-3 (ePub); 978-1-118-90125-0 (ePDF)

Set in 10/12.5 ChaparralPro-Light by TCS/SPS

Printed in the USA by Bind-Rite

Editorial and Production

VP Consumer and Technology

Publishing Director:

Michelle Leete

Associate Director–Book Content

Management:

Martin Tribe

Associate Publisher:

Chris Webb

Executive Commissioning Editor:

Craig Smith

Project Editor:

Sydney Argenta

Copy Editor:

Debbye Butler

Technical Editors:

Jeff Yonker, Alex Bradbury,

Andrew Robinson, and Harry Percival

Editorial Manager:

Rev Mengle

Senior Project Editor:

Sara Shlaer

Editorial Assistant:

Claire Johnson

Marketing

Marketing Manager:

Lorna Mein

Assistant Marketing Manager:

Dave Allen

Publisher’s Acknowledgements

Some of the people who helped bring this book to market include the following:

About the Author

DAVID SALE is a Software Developer currently working

at British Sky Broadcasting (BSkyB) in London, UK as of

2014. He obtained a degree in Computing at the University

of Leeds. Whilst studying Computing, Python was taught

as the main programming language of the course. This is

very different to many other University’s where languages

such as Java are taught initially.

This is where David’s interest in Python first began and he

has looked to further his knowledge in what has become

his core programming language.

Following University, David joined BSkyB in September

2011, as part of the Software Engineering Academy graduate scheme. The scheme proved to

be an excellent platform for David to launch his career in software development.

Notably, David has worked on a RESTful Python application that models BSkyB’s products

and offers, applies complex pricing rules and business logic, whilst delivering a completely

data driven approach to the problem. David has also worked on a project using a Hypermedia

approach to sharing data across the application stack to deliver an innovative solution deliv￾ering sales to existing customers of BSkyB.

David quickly began making his presence known in the Python Community, having written

web articles on various Python topics. David has also given talks on Behaviour Driven

Development and Agile Development at the EuroPython conference, which was held in

Florence, Italy in 2012 and 2013 respectively, with videos of the talks available on YouTube.

David follows Agile Development principles whilst working at BSkyB, with pair program￾ming and Test/Behaviour Driven Development a must. From this focus on testing from such

an early point in his career, he has picked up many tips and techniques in Python testing

which allows development of quality software, which the business has up most confidence

in. It is hoped the tips and advice in this book allow you to learn and improve your daily test￾ing skills in Python.

You can find more on David’s current and previous projects at: www.dsale.co.uk.

Acknowledgments

First and foremost I would like to thank Craig Smith, Executive Commissioning Editor at

Wiley for approaching me with the opportunity to write this book and giving me the confi￾dence in my writing to go for this project; Sydney Jones Argenta, Project Editor, for editing

the book so diligently and keeping me up to date throughout the project; Jeff Younker, Alex

Bradbury, Andrew Robinson, and Harry Percival Technical Editors for ensuring my code was

up to the standard expected by the community and the best it could be.

Secondly, I’d like to give my gratitude to my employer British Sky Broadcasting (Sky). I joined

Sky through their Software Engineering Academy graduate scheme and have since pro￾gressed to a Software Developer. Without their investment in me, I would not have learned

some of the skills and advice that I can now share in this book. They also happily granted me

permission to work on this book and helped me find the time to deliver the project alongside

my work commitments. Please visit http://workforsky.com if you are interested in joining

the team or www.skygraduates.com for more on graduate schemes at Sky.

I’d like to thank my partner Katherine Sweeney, for being so patient in supporting me whilst

working on this book. Without her love and support, I would never have dreamed to deliver

a project like this and she constantly reminds me to believe in myself. This book is an achieve￾ment for us together and I am thankful to have her by my side.

Finally, I would like to thank my brothers Stefan and Matthew Sale for always supporting me

in my endeavours but in particular my parents, Ronald and Jennifer Sale. From an early age

I have always been taught to work hard and reach for your goals. This book is testament to

those words and without the drive to achieve that they have passed on to me; I could never

have seen such a big project through. This book is for them and all the people who have sup￾ported me in my career as a Software Developer.

Contents

Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1

CHAPTER 1

A History of Testing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

You Do Test, Don’t You?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

Fundamentals and Best Practices. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

Python Installation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

Linux. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

Mac. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

Windows. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

Pip. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

Virtualenv. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

Source Control (SVN, Git). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10

Interactive Development Environment (IDE). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

Summary. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

CHAPTER 2

Writing Unit Tests . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

What Is Unit Testing?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

What Should You Test?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

Writing Your First Unit Test. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

Checking Values with the assertEquals Method. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18

Checking Exception Handling with assertRaises. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20

Following the PEP-8 Standard. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22

Unit Test Structure. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23

Additional Unit Test Examples. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24

Getting Clever with assertRaises. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24

Making Your Life Easier with setUp. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25

Useful Methods in Unit Testing. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27

assertEqual(x, y, msg=None). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27

assertAlmostEqual(x, y, places=None, msg=None, delta=None). . . . . . . . . . . . . . 27

assertRaises(exception, method, arguments, msg=None). . . . . . . . . . . . . . . . . . . . 28

assertDictContainsSubset(expected, actual, msg=None). . . . . . . . . . . . . . . . . . . . . 28

assertDictEqual(d1, d2, msg=None). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28

x TESTING PYTHON

assertTrue(expr, msg=None). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28

assertFalse(expr, msg=None). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29

assertGreater(a, b, msg=None). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29

assertGreaterEqual(a, b, msg=None). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29

assertIn(member, container, msg=None). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30

assertIs(expr1, expr2). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30

assertIsInstance(obj, class, msg=None). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30

assertNotIsInstance(obj, class, msg=None). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30

assertIsNone(obj, msg=None). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30

assertIsNot(expr1, expr2, msg=None). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31

assertIsNotNone(obj, msg=None). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31

assertLess(a, b, msg=None). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31

assertLessEqual(a, b, msg=None). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31

assertItemsEqual(a, b, msg=None). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31

assertRaises(excClass, callableObj, *args, **kwargs, msg=None). . . . . . . . . . . . . . . 32

Summary. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32

CHAPTER 3

Utilizing Unit Test Tools . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33

Using Python’s Nose. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33

Installing Nose. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34

Using Nose’s Best Features. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35

Running Specific Test Files. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35

Getting More Detail with Verbose. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35

Debugging Support with PDB. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36

Checking Your Coverage. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38

Coloring your tests with Rednose. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39

PyTest: An Alternative Test Runner. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40

Installing PyTest. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40

PyTest’s Best Features. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41

Running Specific Tests. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41

Viewing Detail with Verbose and Summary. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42

Debugging with PDB. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43

Checking Your Coverage with PyTest. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45

Choosing Between Nose and PyTest. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46

Mock and Patch Tricky Situations. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46

TABLE OF xi CONTENTS

Installing the Mock Library. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47

Mocking a Class and Method Response. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47

When Mock Won’t Do, Patch!. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50

The Requests Library. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50

Patch in Action. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50

Advanced Mocking. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52

Summary. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53

CHAPTER 4

Writing Testable Documentation  . . . . . . . . . . . . . . . . . . . . . . . . . . 55

Writing Your First Doctest. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56

The Python Shell. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56

Adding Doctests to a Method. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57

Running Your Doctests. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58

Handling Error Cases. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59

Advanced Doctest Usage. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61

Improving Doctests with Nose Integration. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62

Summary. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65

Resources. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65

CHAPTER 5

Driving Your Development with Tests. . . . . . . . . . . . . . . . . . . . . . . 67

Agile Development . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67

Adopting the Agile Process Now. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68

Ethos of Test Driven Development. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70

Advantages of Test Driven Development. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72

Ping-Pong Programming. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72

Test Driving Your Problem. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73

Writing Your Failing Test. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74

Making Your Test Pass. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75

Driving More Features with Tests. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75

Wrapping Up the Task. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77

Summary. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82

Resources. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83

xii TESTING PYTHON

CHAPTER 6

Writing Acceptance Tests . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85

What Is Acceptance Testing?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85

Anatomy of an Acceptance Test. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87

Using Gherkin Syntax. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87

The Magic Is in the Step File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88

Goals of Acceptance Testing. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89

Implementing Developer and QA Collaboration. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90

Letting Behavior Drive Your Problem. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90

Writing Your Failing Acceptance Test. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90

Defining Your Steps. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92

Implementing Your Code. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94

Developing More of the Feature. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95

bank_app.py. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96

index.html. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97

Delivering the Finished Article. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98

Advanced Acceptance Test Techniques. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102

Scenario Outline. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102

Tables of Data in Scenarios. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103

Summary. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104

Resources. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105

CHAPTER 7

Utilizing Acceptance Test Tools . . . . . . . . . . . . . . . . . . . . . . . . . . 107

Cucumber: The Acceptance Test Standard. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107

Lettuce in Detail. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108

Tagging. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108

Fail Fast. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112

Nosetest Integration. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114

Robot: An Alternative Test Framework. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115

Installing Robot. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116

Writing a Test Case. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116

Implementing Keywords. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117

Running Robot Tests. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .119

Summary. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123

Resources. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123

TABLE OF xiii CONTENTS

CHAPTER 8

Maximizing Your Code’s Performance  . . . . . . . . . . . . . . . . . . . . . 125

Understanding the Importance of Performance Testing. . . . . . . . . . . . . . . . . . . . . . . . . 126

JMeter and Python. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126

Installation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127

Configuring Your Test Plans. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128

Utilizing Your Test Plans Effectively. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135

Code Profiling with cProfile. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135

Run a cProfile Session. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136

Analyzing the cProfile Output. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142

Summary. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144

Resources. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144

CHAPTER 9

Looking After Your Lint . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145

Coming to Grips with Pylint. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146

Installing Pylint. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146

Using Pylint. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146

Understanding the Pylint Report. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149

The Module Block. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149

The Messages by Category Section. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149

The Messages Section. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150

The Code Evaluation Score. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150

The Raw Metrics Section. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150

The Statistics by Type Section. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150

Customizing Pylint’s Output. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150

Telling Pylint to Ignore Errors. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153

Covering All Your Code with Unit Tests. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154

Installing Coverage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155

Using Coverage. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .155

Advanced Coverage Options. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157

Producing an HTML/XML Report. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157

Setting a Minimum Coverage Threshold . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159

Restricting Coverage to a Specific Package. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159

Ignoring Coverage. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160

Summary. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161

Resources. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162

Tải ngay đi em, còn do dự, trời tối mất!