83 lines
2.4 KiB
Markdown
83 lines
2.4 KiB
Markdown
PyMOL Testing Framework
|
|||
|
|
=======================
|
||
|
|
|
||
|
|
This is a python unittest based testing framework for PyMOL.
|
||
|
|
|
||
|
|
*Notice: "gui" tests currently don't work with PyMOL 2.x, tests should be
|
||
|
|
run with "pymol -c ...".*
|
||
|
|
|
||
|
|
How to Run Tests
|
||
|
|
----------------
|
||
|
|
|
||
|
|
From the system command line:
|
||
|
|
|
||
|
|
pymol -cq /path/to/pymol-testing/runall.pml
|
||
|
|
|
||
|
|
From the pymol command line:
|
||
|
|
|
||
|
|
PyMOL> run /path/to/pymol-testing/testing.py
|
||
|
|
PyMOL> run_testfiles path/to/*.py
|
||
|
|
|
||
|
|
How to write Tests
|
||
|
|
------------------
|
||
|
|
|
||
|
|
A test is a method of a `pymol.testing.PyMOLTestCase` subclass and is named
|
||
|
|
with a "test" prefix. Test files go into subdirectories like "api/" or
|
||
|
|
"performance/". Each test method will start
|
||
|
|
|
||
|
|
* with a clean PyMOL session (does reinitialize)
|
||
|
|
* from the directory of its file (does os.chdir)
|
||
|
|
|
||
|
|
Decorators
|
||
|
|
----------
|
||
|
|
|
||
|
|
* `@testing.requires(keyword)`: Takes one or more keywords and skips the
|
||
|
|
test, if the requirement is not met. Valid keywords include: gui,
|
||
|
|
incentive, network, `no_run_all`, multicore
|
||
|
|
* `@testing.foreach(args1, args2, ...)`: Decorates a test method which
|
||
|
|
takes arguments
|
||
|
|
|
||
|
|
Context Managers
|
||
|
|
----------------
|
||
|
|
|
||
|
|
* `PyMOLTestCase.timing(max=sec)`: Gives feedback on running time and
|
||
|
|
makes the test fail if it takes longer than `max` seconds.
|
||
|
|
* `PyMOLTestCase.mktemp()`: Generates a temporary file name and deletes
|
||
|
|
the file at context exit.
|
||
|
|
|
||
|
|
Assertion Methods
|
||
|
|
-----------------
|
||
|
|
|
||
|
|
In addition to the standard assertion methods of the unittest.TestCase
|
||
|
|
class, these assertion methods are currently available:
|
||
|
|
|
||
|
|
* `assertImageEqual(img1, img2=None, delta=0)`: Takes two images (as
|
||
|
|
filenames, PIL objects or numpy arrays). If only one image is given,
|
||
|
|
grab the current PyMOL scene as second imagae
|
||
|
|
* `assertImageHasColor(color, img=None, delta=0)`: Takes a color name, RGB
|
||
|
|
or RGBA color tuple and an image (or grab the current scene) and check
|
||
|
|
if it contains the given color
|
||
|
|
* `assertImageHasNotColor`
|
||
|
|
* `assertImageHasTransparency`
|
||
|
|
* `assertImageHasNoTransparency`
|
||
|
|
* `assertColorEqual`
|
||
|
|
* `assertArrayEqual`
|
||
|
|
* `assertArrayNotEqual`
|
||
|
|
|
||
|
|
Code Example
|
||
|
|
------------
|
||
|
|
|
||
|
|
from pymol import cmd, testing, stored
|
||
|
|
|
||
|
|
class TestSomething(testing.PyMOLTestCase):
|
||
|
|
|
||
|
|
def testFoo(self):
|
||
|
|
cmd.fragment('ala')
|
||
|
|
cmd.show_as('sticks')
|
||
|
|
cmd.orient()
|
||
|
|
self.assertImageEqual('ref-foo.png')
|
||
|
|
|
||
|
|
@testing.requires('gui')
|
||
|
|
def testBar(self):
|
||
|
|
cmd.some_opengl_feature()
|