Home > Mobile >  Calling a program with command line parameters with Pytest
Calling a program with command line parameters with Pytest

Time:11-19

This is my first time using Pytest, I have a program that is called with command line parameters, as in :

$ myprog -i value_a -o value_b

I am not sure how to use Pytest to test the output of this program. Given values of value_a and value_b, I expect a certain output that I want to test.

The Pytest examples that I see all refer to testing functions, for instance if there is a function such as:

import pytest

def add_nums(x,y):
    return x   y

def test_add_nums():
    ret = add_nums(2,2)
    assert ret == 4

But I am not sure how to call my program using Pytest and not just test individual functions? Do I need to use os.system() and then call my program that way?

In my program I am using argparse module.

CodePudding user response:

The solution is based on monkeypatch fixture. In below example myprog reads number from the file myprog_input.txt adds 2 to it and stores result in myprog_output.txt

  1. Program under test
cat myprog.py
#!/usr/bin/python3.9
import argparse
import hashlib

def main():
    parser = argparse.ArgumentParser(description='myprog')
    parser.add_argument('-i')
    parser.add_argument('-o')
    args = parser.parse_args()
    with open(args.i) as f:
        input_data=int(f.read())
    output_data=input_data 2
    f.close()
    with open(args.o,"w") as fo:
        fo.write(str(output_data)   '\n')
    fo.close()
    with open(args.o) as fot:
        bytes = fot.read().encode() # read entire file as bytes
    fot.close()
    readable_hash = hashlib.sha256(bytes).hexdigest();
    return readable_hash 


if __name__ == '__main__':
    print(main())
  1. Test
cat test_myprog.py
#!/usr/bin/python3.9
import sys
import myprog

def test_myprog(monkeypatch):
    with monkeypatch.context() as m:
        m.setattr(sys, 'argv', ['myprog', '-i', 'myprog_input.txt', '-o', 'myprog_output.txt'])
        assert myprog.main() == 'f0b5c2c2211c8d67ed15e75e656c7862d086e9245420892a7de62cd9ec582a06'
  1. Input file
cat myprog_input.txt
3
  1. Running the program
myprog.py -i myprog_input.txt -o myprog_output.txt
f0b5c2c2211c8d67ed15e75e656c7862d086e9245420892a7de62cd9ec582a06
  1. Testing the program
pytest test_myprog.py
============================================= test session starts =============================================
platform linux -- Python 3.9.5, pytest-6.2.5, py-1.10.0, pluggy-1.0.0
rootdir: /home/<username>/py
plugins: hypothesis-6.23.1
collected 1 item                                                                                              

test_myprog.py .                                                                                        [100%]
============================================== 1 passed in 0.04s ==============================================

  • Related