簡體   English   中英

如何在python中使用nosetests同時傳遞/接受argparse的參數?

[英]How to use nosetests in python while also passing/accepting arguments for argparse?

我想在我的項目中使用nosecoverage 當我使用--with-coverage參數運行nose時,我的程序參數解析模塊變得瘋狂,因為“--with-coverage”根據它不是一個真正的參數。

如何關閉argparse,但僅在測試期間? Nose說我的所有測試都因為不好的論點而失敗。

實際上我前幾天就遇到過這個問題。 您不需要“禁用”您的解析模塊或任何東西。 您可以做的是更改使用argparse的模塊,以忽略它接收到的無法識別的參數。 這樣,它們仍然可以被其他腳本使用(例如,如果您的命令行調用將輔助參數傳遞給另一個程序執行)。

沒有你的代碼,我假設你在argparse.ArgumentParser實例上使用標准的parse_args()方法。 parse_known_args()替換它。

然后,每當你隨后引用解析參數Namespace對象時,你需要指定和元素,特別是0.雖然parse_args()返回args對象, parse_known_args()返回tuple:第一個元素是已解析的已知參數,而后一個元素包含忽略的無法識別的參數(如果需要,您可以在以后使用/傳遞Python代碼)。

以下是我自己項目的示例更改:

class RunArgs(object):
    '''
    A placeholder for processing arguments passed to program execution.
    '''

    def __init__(self):
        self.getArgs()
        #self.pause = self.args.pause  # old assignment
        self.pause = self.args[0].pause  # new assignment
        #...

    def __repr__(self):
        return "<RunArgs(t=%s, #=%s, v=%s)>" % (str(x) for x in (self.pause,self.numreads,self.verbose))

    def getArgs(self):
        global PAUSE_TIME
        global NUM_READS
        parser = argparse.ArgumentParser()
        parser.add_argument('-p', '--pause', required=False, 
            type=self.checkPauseArg, action='store', default=PAUSE_TIME)
        parser.add_argument('-n', '--numreads', required=False, 
            type=self.checkNumArg, action='store', default=NUM_READS)
        parser.add_argument('-v', '--verbose', required=False,
            action='store_true')
        #self.args = parser.parse_args()  # old parse call
        self.args = parser.parse_known_args()  # new parse call
        #...

我已經讀過你可以使用nose-testconfig ,或者用mock替換這個調用(不測試它)。 雖然我同意@Ned Batchelder,但它會質疑問題的結構。

作為一種變通方法,您可以在當前工作目錄中使用.nosercnose.cfg ,而不是使用命令行參數運行鼻子:

[nosetests]
verbosity=3
with-coverage=1

雖然,我同意parse_known_args()是一個更好的解決方案。

聽起來你有運行你的代碼的測試,然后你的代碼使用argparse隱含地從sys.argv中提取參數。 這是構建代碼的不好方法。 您正在測試的代碼應該是以其他方式傳遞給它的參數,以便您可以控制它看到的參數。

這是全局變量為什么不好的一個例子。 sys.argv是一個全局的,由整個過程共享。 您依靠全局限制了代碼的模塊性,從而限制了可測試性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM