Adding blurb about using pytest runner and cx_freeze
--HG-- branch : cx_freeze-docs
This commit is contained in:
		
							parent
							
								
									d98521b0d9
								
							
						
					
					
						commit
						66bd4e485a
					
				| 
						 | 
				
			
			@ -681,3 +681,58 @@ and run it::
 | 
			
		|||
You'll see that the fixture finalizers could use the precise reporting
 | 
			
		||||
information.
 | 
			
		||||
 | 
			
		||||
Integrate pytest runner with cx_freeze
 | 
			
		||||
-----------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
If you freeze your application using a tool like
 | 
			
		||||
`cx_freeze <http://cx-freeze.readthedocs.org>`_ in order to distribute it
 | 
			
		||||
to your end-users, it is a good idea to also package your test runner and run
 | 
			
		||||
your tests using the frozen application.
 | 
			
		||||
 | 
			
		||||
This way you can detect packaging errors such as dependencies not being
 | 
			
		||||
included into the executable while also allowing you to send test files to
 | 
			
		||||
users so they can run them in their machines, which can be invaluable to
 | 
			
		||||
obtain more information about a hard to reproduce bug.
 | 
			
		||||
 | 
			
		||||
Unfortunately embedding the ``pytest`` runner into a frozen executable using
 | 
			
		||||
``cx_freeze`` is not as straightforward as one would like,
 | 
			
		||||
because ``pytest`` makes heavy use of dynamic module loading which
 | 
			
		||||
``cx_freeze`` can't resolve by itself.
 | 
			
		||||
 | 
			
		||||
To solve this, you have to manually include internal ``pytest`` and ``py``
 | 
			
		||||
modules by using the ``build_exe`` option in your ``setup.py`` script like this::
 | 
			
		||||
 | 
			
		||||
    # contents of setup.py
 | 
			
		||||
    from cx_Freeze import setup, Executable
 | 
			
		||||
 | 
			
		||||
    includes = [
 | 
			
		||||
        '_pytest.doctest',
 | 
			
		||||
        '_pytest.unittest',
 | 
			
		||||
        # ... lots more
 | 
			
		||||
    ]
 | 
			
		||||
    setup(
 | 
			
		||||
        name="runtests",
 | 
			
		||||
        options={"build_exe": {'includes': includes}},
 | 
			
		||||
        # ... other options
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
(For the complete list, check out the modules under ``_pytest`` in your
 | 
			
		||||
site-packages).
 | 
			
		||||
 | 
			
		||||
With that, you can make your program pass control over to ``pytest`` by looking
 | 
			
		||||
for a certain flag and handing over the other arguments::
 | 
			
		||||
 | 
			
		||||
    # contents of app_main.py
 | 
			
		||||
    import sys
 | 
			
		||||
 | 
			
		||||
    if len(sys.argv) > 1 and sys.argv[1] == '--pytest':
 | 
			
		||||
        import pytest
 | 
			
		||||
        sys.exit(pytest.main(sys.argv[2:]))
 | 
			
		||||
    else:
 | 
			
		||||
        # normal application execution: at this point argv can be parsed
 | 
			
		||||
        # by your argument-parsing library of choice as usual
 | 
			
		||||
        ...
 | 
			
		||||
 | 
			
		||||
Making it easy to execute your tests from within your frozen application::
 | 
			
		||||
 | 
			
		||||
    $ ./app_main --pytest --verbose --tb=long tests/
 | 
			
		||||
		Loading…
	
		Reference in New Issue