.. include:: <s5defs.txt>

=================================================
py.test - flexible and powerful automated testing 
=================================================

:Authors: Holger Krekel, merlinux GmbH
:Date: 13th March 2006 

Intro: Benefits of Automated Testing 
======================================

- prove that code changes actually fix a certain issue
- minimizing Time to Feedback for developers
- reducing overall Time to Market 
- document usage of plugins 
- tests as a means of communication
- easing entry for newcomers 

py.test Purposes & Goals
===============================

- automated cross-project open source testing tool 
- flexible per-project customization 
- reusing test methods/reporting across projects 
- various iterative test collection methods 
- support for distributed testing 
- py lib is a development support library

What is Python? 
===============================

- easy-to-learn flexible OO high level language
- glue-language for connecting C++, Java and scripting
- used e.g. by Google for deployment/testing/implementation
- used by BIND (mainstream DNS internet server) for testing
- Jython provides Python for JVM 
- IronPython provides Python for .NET 
- CPython is mainstream C-based platform
- PyPy - Python in Python implementation 

Main drivers of py.test development
======================================

- PyPy project testing needs (part of EU project)
- needs by individual (freely contributing) projects
- at least 20 projects using py.test and py lib
- higher level innovation plans by merlinux & experts 
- commercial needs
- almost three years of (non-fulltime) development 

Authors & copyrights
==============================================

- initial: Holger Krekel, Armin Rigo 
- major contributors: Jan Balster, Brian Dorsey, Grig
  Gheorghiu
- many others with small patches
- MIT license 

who is merlinux?
===============================

- small company founded in 2004 by Holger Krekel and Laura
  Creighton 

- purpose: research and development / open source technologies 

- 7 employees (no win32 experts!), 6 freelancers

- three larger projects: 

  - PyPy - next generation Python implementation 
  - mailwitness - digital invoicing/signatures 
  - provider of development servers 

- technologies: virtualization, deployment and testing 

Main Features of py.test 
===============================

- simplest possible ``assert`` approach 
- clean setup/teardown semantics
- stdout/stderr capturing per test
- per-project/directory cmdline options (many predefined)
- test selection support 
- customizable auto-collection of tests
- `more features`_ ...

.. _`more features`: ../test.html#features

Main User-Level entry points 
===============================

- ``py.test.raises(Exc, func, *args, **kwargs)``
- ``py.test.fail(msg)`` -> fail a test
- ``py.test.skip(msg)`` -> skip a test 
- ``py.test.ensuretemp(prefix)`` -> per-test session temporary directory 
- ``conftest.py`` can modify almost arbitrary testing aspects
  (but it's a bit involved) 

some py lib components 
===============================

- ``py.execnet`` provides ad-hoc means to distribute programs 
- ``py.path`` objects abstract local and svn files 
- ``py.log`` offers (preliminary) logging support 
- ``py.xml.html`` for programmatic html generation 
- lazy import ...``import py`` is enough

py.test Implementation
===============================

- `basic picture`_
- Session objects (Terminal and Tcl-GUI)
- reporting hooks are on session objects
- Collector hierarchy yield iteratively tests
- uses py lib extensively (py.path/py.execnet) 
- "conftest.py" per-directory configuration mechanism 

.. _`basic picture`: ../test.html

Session objects 
===============================

- responsible for driving the testing process
- make use of iterative Collector hierarchies 
- responsible for reporting (XXX)
- can be split to a Frontend and BackendSession 
  for distributed testing (GUI frontend uses it) 

Collector objects 
===============================

- Collectors / Test Items form a tree
- the tree is build iteratively (driven from Sessions)
- collector tree can be viewed with ``--collectonly``
- ``run()`` returns list of (test) names or runs the test
- ``join(name)`` returns a sub collector/item 
- various helper methods to e.g. determine file/location

Extensions: ReST documentation checking
=========================================

- `py/documentation/conftest.py`_ provides test 
  items for checking documentation and link integrity

- uses its own collector/testitem hierarchy 

- invokes ``docutils`` processing, reports errors 

.. _`py/documentation/conftest.py`: ../conftest.py 

Extensions: Distributed Testing
==============================================

- using py.execnet to dispatch on different python versions
- using py.execnet to dispatch tests on other hosts/platforms
- currently: Popen, SSH and Socket gateways 
- missing support pushing tests to "the other side" 
- missing for deployment on multiple machines 
- but it's already possible ... 

Example using pywinauto from linux 
==============================================

- start socketserver.py on windows 
- connect a SocketGateway e.g. from linux 
- send tests, execute and report tracebacks through the
  gateway
- remotely use pywinauto to automate testing of GUI work flow 
- interactive example ... 

Status of py lib 
===============================

- mostly developed on linux/OSX
- basically all tests pass on win32 as well
- but missing some win32 convenience 
- some support for generation of html/ReST/PDFs reports
- py.execnet works rather reliably (pending deeper win32 testing) 
- flexible configuration but sometimes non-obvious/documented 
  (requires understanding of internals) 

Next Steps py lib / py.test 
===============================

- refined py.execnet distribution of programs 
- more configurable and customizable reporting 
- implement support for testing distribution 
- explore refined win32 support 
- automated collection of unittest.py based tests
- make spawning processes/gateways more robust 
- doctest support 
- unify logging approaches (py.log.*)
- ... 


.. |bullet| unicode:: U+02022
.. footer:: Holger Krekel (merlinux) |bullet| |bullet| 13th March 2006 
