Как сделать модульный тест для входного аргумента из командной строки? - PullRequest
0 голосов
/ 21 июня 2019

У меня есть скрипт на Python, поддерживающий некоторые команды с аргументами. Мне нужно добавить модульный тест для команд с аргументами.

У меня есть код ниже, который отлично работает.

#!/usr/bin/python3.7
#

import argparse
import sys
import re

def isStringValid(string):
    regex = re.compile('[@_!#$%^&*()<>?/\|}{~:]')
    if regex.search(string) is None:
        return True
    else:
        return False

class App(object):

    def __init__(self):
        parser = argparse.ArgumentParser(
            description='App script',
            usage='''./app.py <command> [<args>]

The most commonly used ts commands are:
    width             Get width
    play <file>       Play audio file
''')
        parser.add_argument('command', help='Subcommand to run')
        args = parser.parse_args(sys.argv[1:2])
        if not hasattr(self, args.command):
            print('Unrecognized command')
            parser.print_help()
            exit(1)
        getattr(self, args.command)()

    @staticmethod
    def width():
        parser = argparse.ArgumentParser(
            description='Get width')
        args = parser.parse_args(sys.argv[2:])
        print('width: 10cm')

    @staticmethod
    def play():
        parser = argparse.ArgumentParser(
            description='Play audio file')
        parser.add_argument('value', help='Play audio file')
        args = parser.parse_args(sys.argv[2:])
        if args.value is not None:
            result = isStringValid(args.value)
            if result is True:
                # Play audio file
                print('play: OK')
            else:
                print('play: invalid input! Error Code: 1')



if __name__ == '__main__':
    App()

Вот модульный тест. Я реализовал модульный тест для команды 'width'. Но для команды «играть». Я не знаю, как добавить модульный тест для него. По сути, мне нужно проверить входной аргумент "play ring.wav", который является допустимым входным. Мне также нужно проверить входной аргумент "play ring ^ &. Wav", который недопустим. Но как добавить модульный тест для этих тестов?

#!/usr/bin/python3.7

import unittest
import argparse

from app import *


class TestApp(unittest.TestCase):

    def test_width(self):
        result = App.width()
        self.assertEqual(result, None)

    #def test_play_valid(self):
        # need to test the input argument "play ring.wav", but how?

    #def test_play_invalid(self):
        # need to test the input argument "play ring^&.wav", but how?

if __name__ == '__main__':
    unittest.main()

Что мне нужно, так это: выполнить тестовый модуль вместо того, чтобы делать это, набрав команду вручную:

$ ./app.py play ring.wav
play: OK

$ ./app.py play ring~%.wav
play: invalid input! Error Code: 1
...