Мне кажется, что это не типичный модульный тест (который проверяет функцию или метод), а интеграционный тест (который проверяет подсистему извне).Но, конечно, вы все равно можете решить эту проблему с помощью типичных инструментов тестирования Python, таких как unittest
.
. Простым решением было бы запустить скрипт с использованием subprocess
, захватить выходные данные, а затем проанализировать эти выходные данные как часть.вашего теста:
import unittest
import os
import sys
if os.name == 'posix' and sys.version_info[0] < 3:
import subprocess32 as subprocess
else:
import subprocess
class TestScriptInvocation(unittest.TestCase):
def setUp(self):
"""call the script and record its output"""
result = subprocess.run(["./main_config.sh", "/Users/yasserkhan/Desktop/yaml/", "2018-12-23"], stdout=subprocess.PIPE)
self.returncode = result.returncode
self.output_lines = result.stdout.decode('utf-8').split('\n')
def test_returncode(self):
self.assertEqual(self.returncode, 0)
def test_last_line_indicates_success(self):
self.assertEqual(self.output_lines[-1], 'Writing to file')
if __name__ == '__main__':
unittest.main()
Обратите внимание, что этот код использует бэкпорт модуля Python 3 subprocess
.Кроме того, он пытается декодировать содержимое result.stdout
, потому что в Python 3 это будет bytes
объект, а не str
, как в Python 2. Я не тестировал его, но эти две вещи должны составлять кодПереносим между 2 и 3.
Также обратите внимание, что использование абсолютных путей, таких как "/Users/yasserkhan/Desktop/yaml"
, может легко сломаться, поэтому вам нужно либо найти относительный путь, либо передать базовый путь к тестам, используя, например, переменные среды.
Вы можете добавить дополнительные тесты, которые будут анализировать другие строки и проверять наличие приемлемых выходных данных, таких как размер файла в ожидаемом диапазоне.