如何从命令行对输入参数进行单元测试?

时间:2019-06-20 21:31:13

标签: python unit-testing testing command-line-arguments

我有一个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()

这是单元测试。我对“宽度”命令实施了单元测试。但是对于“播放”命令。我不知道如何为它添加单元测试。基本上,我需要测试输入参数“ 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

0 个答案:

没有答案