Вызов программы с параметрами командной строки с помощью Pytest

#python-3.x #pytest

Вопрос:

Это мой первый раз, когда я использую Pytest, у меня есть программа, которая вызывается с параметрами командной строки, как в :

 $ myprog -i value_a -o value_b  

Я не уверен, как использовать Pytest для тестирования результатов этой программы. Учитывая значения value_a и value_b, я ожидаю определенного результата, который я хочу протестировать.

Примеры Pytest, которые я вижу, все относятся к функциям тестирования, например, если есть такая функция, как:

 import pytest  def add_nums(x,y):  return x   y  def test_add_nums():  ret = add_nums(2,2)  assert ret == 4   

Но я не уверен, как вызвать мою программу с помощью Pytest, а не просто протестировать отдельные функции? Нужно ли мне использовать os.system (), а затем вызывать свою программу таким образом?

В своей программе я использую модуль argparse.

Ответ №1:

Решение основано на приспособлении monkeypatch. В приведенном ниже примере myprog считывает число из файла myprog_input.txt , добавляет к нему 2 и сохраняет результат в myprog_output.txt

  1. Тестируемая программа
 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. Тест
 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. Входной файл
 cat myprog_input.txt 3  
  1. Запуск программы
 myprog.py -i myprog_input.txt -o myprog_output.txt f0b5c2c2211c8d67ed15e75e656c7862d086e9245420892a7de62cd9ec582a06  
  1. Тестирование программы
 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/lt;usernamegt;/py plugins: hypothesis-6.23.1 collected 1 item   test_myprog.py . [100%] ============================================== 1 passed in 0.04s ==============================================