Python使用必需参数测试CLI应用程序

时间:2017-10-26 14:30:55

标签: python python-3.x unit-testing testing

首先:我对测试领域很陌生。所以我的理解可能有些不对劲。

我的情况如下:我正在开发一个框架,最终用户必须从我预定义的父类继承。他们需要覆盖我在父类中定义的四个抽象方法,并在这些方法中写出魔术代码。

该框架提供了三种不同的模式。因为我想确保不会出现错误,所以我添加了一个位置CLI参数来设置该模式。

这是我的问题:我正在尝试为我的应用程序中的每个模块编写单元测试。因为上面提到的父类有很多代码,所以我也想对它进行单元测试。

毋庸置疑,如果不提供所需的位置参数,它将无法运行。

我环顾四周看看如何以编程方式提供这个参数,但互联网告诉我,单元测试应该能够在没有任何外部信息的情况下运行(有意义)。

我的问题:我如何测试这样的模块?是否有其他类型的测试适合这类问题?

提前谢谢!

更新

以下是评论中要求的代码示例。实际的模式变量是围绕我在本例中保留的其他几个类传递来保持简短。但问题是,如果你运行python user.py(在我的情况下,PyCharm在运行unittest时为我做了),它需要设置mode参数。单元测试BaseClass也不起作用,因为抽象方法没有被覆盖。

from abc import abstractmethod
from abc import ABC
import argparse

# base.py
class BaseClass(ABC):
    def __init__(self):
        self.args = self._parse_cli_args()

    def _parse_cli_args(self):
        self.parser = argparse.ArgumentParser(
            description='MyApp'
        )

        self.parser.add_argument(
            'mode',
            choices=[
                'mode1',
                'mode2',
                'mode3'
            ],
            metavar='MODE [mode1, mode2, mode3]'
        )

    # the methods i'd like to unittest
    def methodIWantToTest1(self):
        # some useful computations
        pass

    def methodIWantToTest2(self):
        # some useful computations
        pass

    def methodIWantToTest3(self):
        # some useful computations
        pass


    # methods that should be overridden by end User (UserClass below)
    @abstractmethod
    def abstractMethod1(self):
        pass

    @abstractmethod
    def abstractMethod2(self):
        pass

    @abstractmethod
    def abstractMethod3(self):
        pass

    @abstractmethod
    def abstractMethod4(self):
        pass

# user.py
class UserClass(BaseClass):
    def AbstractMethod4(self):
        super().abstractMethod4()
    #     users implementation here

    def AbstractMethod3(self):
        super().abstractMethod3()
    #     users implementation here

    def AbstractMethod2(self):
        super().abstractMethod2()
    #     users implementation here

    def AbstractMethod1(self):
        super().abstractMethod1()
        # users implementation here

0 个答案:

没有答案