Getting Started¶
After installation, to see the available options to the pysys.py script use:
> pysys.py --help
The script has four main commands:
makeproject
to create your top-level testing project configuration file,make
to create individual testcases,run
to execute them, andclean
to delete testcase output after execution.
For detailed information, see the --help
command line.
To get started, create a new directory to hold your tests. Then run the
makeproject
command from that directory to add a pysysproject.xml
file which will hold default settings for your tests:
> mkdir test
> cd test
> pysys.py makeproject
Then to create your first test, run:
> pysys.py make MyApplication_001
This will create a MyApplication_001
subdirectory with a pysystest.py
file that contains both “descriptor”
metadata about the test such as its title, and a Python class where you can add the logic to execute
your test,
and to validate
that the results are as expected.
To run your testcases, simply execute:
> pysys.py run
To give a flavour for what’s possible, here’s a system test for checking the behaviour of a server application called MyServer, which shows of the most common PySys methods:
__pysys_title__ = r""" MyServer startup - basic sanity test (+ demo of PySys basics) """
__pysys_purpose__ = r""" To demonstrate that MyServer can startup and response to basic requests.
"""
class PySysTest(pysys.basetest.BaseTest):
def execute(self):
# Ask PySys to allocate a free TCP port to start the server on (this allows running many tests in
# parallel without clashes)
serverPort = self.getNextAvailableTCPPort()
# A common system testing task is pre-processing a file, for example to substitute in required
# testing parameters
self.copy(self.input+'/myserverconfig.json', self.output+'/', mappers=[
lambda line: line.replace('@SERVER_PORT@', str(serverPort)),
])
# Start the server application we're testing (as a background process)
# self.project provides access to properties in pysysproject.xml, such as appHome which is the
# location of the application we're testing
server = self.startProcess(
command = self.project.appHome+'/my_server.%s'%('bat' if IS_WINDOWS else 'sh'),
arguments = ['--configfile', self.output+'/myserverconfig.json', ],
environs = self.createEnvirons(addToExePath=os.path.dirname(PYTHON_EXE)),
stdouterr = 'my_server', displayName = 'my_server<port %s>'%serverPort, background = True,
)
# Wait for the server to start by polling for a grep regular expression. The errorExpr/process
# arguments ensure we abort with a really informative message if the server fails to start
self.waitForGrep('my_server.out', 'Started MyServer .*on port .*', errorExpr=[' (ERROR|FATAL) '], process=server)
# Run a test tool (in this case, written in Python) from this test's Input/ directory.
self.startPython([self.input+'/httpget.py', f'http://localhost:{serverPort}/data/myfile.json'],
stdouterr='httpget_myfile')
def validate(self):
# This method is called after execute() to perform validation of the results by checking the
# contents of files in the test's output directory. Note that during test development you can
# re-run validate() without waiting for a full execute() run using "pysys run --validateOnly".
# It's good practice to check for unexpected errors and warnings so they don't go unnoticed
self.assertGrep('my_server.out', ' (ERROR|FATAL|WARN) .*', contains=False)
# Checking for exception stack traces is also a good idea; and joining them into a single line with a mapper will
# give a more descriptive error if the test fails
self.assertGrep('my_server.out', r'Traceback [(]most recent call last[)]', contains=False,
mappers=[pysys.mappers.JoinLines.PythonTraceback()])
self.assertThat('message == expected',
message=pysys.utils.fileutils.loadJSON(self.output+'/httpget_myfile.out')['message'],
expected="Hello world!",
)
self.logFileContents('my_server.out')
If you’re curious about any of the functionality demonstrated above, there’s lots of helpful information on these methods and further examples in the documentation:
pysys.basetest.BaseTest.startProcess()
(+pysys.basetest.BaseTest.createEnvirons()
andpysys.basetest.BaseTest.startPython()
)
Now take a look at pysys.basetest
to begin exploring more of the powerful functionality
PySys provides to help you implement your own pysystest.py
system tests.
The sample projects under https://github.com/pysys-test are a great starting point for learning more about PySys, and for creating your first project.