Using parameters in Python unittest

I’ve been writing some unit tests for pymqi and fell at the first hurdle. How do I provide logon information? This cannot be hard coded because every one’s system is different. You cannot pass command line parameters to the unittest module, so how do you do it?

The second hurdle was how do I provide configuration information on what to test.
I solved these in two slightly different ways.

Logging on, or connecting to MQ

I created a separate python script called myConnect.py and put the logon information in that.

To be able to use the unit tests, you just have to customise the myConnect.py and use that.

My file does the connection, and had

import sys
import platform
import pymqi
import threading
def connect():
    queue_manager = 'CSQ9'
    qmgr = pymqi.connect(queue_manager)
    return qmgr

In my unit test script I had

import myConnect
class inq(unittest.TestCase):
    def setUp(self):
        self.qmgr = myConnect.connect()

Simple… and if I need to change my logon information, I just change one file instead of changing all of the scripts.

Passing parameters to the test.

I wanted to be able to pass a “debug option” to the tests, to be able to print information, and to pass other configuration. With the command

python3 -m unittest -v ut.inq1.test_inq_log

you cannot pass parameters.

Environment data

You can pass environment data for example, passing the variables inline

userid="user1" password="secret1" python -m unittest test

and your test.py has

user  = os.environ["userid"]
password = os.environ["password"]

External configuration file

I found it easier to set up a utparms.py and store my variables in that, for example

queues = ["CP0000","CP0001"]

I can then import and use the file.

import utparms
...
queues = utparms.queues
for q in queues:
    ....

This is different to the myConnect.py above, as the myConnect.py has logic to do the connection. The utparms.py is just a list of variable defines, with no logic.

To use this I can have a shell script like

# recreate the utmarms.py every time
cp simpleutparms.py utparms.py
python3 -m unittest -v ut.inq1.test_inq_log

or

cp reallybigutparms.py utparms.py
python3 -m unittest -v ut.inq1.test_inq_log

or dynamically create the utparms.py file.

Do not bang your head against a wall when you have a problem – go round it!

You may think these are obvious, but things are only obvious1 when you understand them. Too many people write tests where the configuration information is within the test, and not isolated, so it is clearly not obvious.


1 I remember reading about a university and the definition of obvious:

  • If professor X says it is obvious, then it is,
  • If professor Y says it is obvious, then after an hours thought it should be obvious,
  • If professor Z says it is obvious, then after a year’s work you will understand it.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s