Pythonのunittestを使用する際に、argparseを使用したプログラムでunrecognized argumentsエラーが発生することがあります。この記事では、その問題の解決法を説明します。

問題の原因

このエラーは、argparseを使用してコマンドライン引数を解析するプログラムをunittestでテストしようとするときに発生します。具体的には、以下のようなコードで問題が発生します。

# program.py
import argparse

parse = argparse.ArgumentParser(description="Command line program.")
parse.add_argument("--key", type=str, help="Enter key")
parse.add_argument("--output", type=str, help="Path to place results.")
args = parse.parse_args()

def program():
    # Use args here

def writefile():
    # Uses args and write to file

if __name__ == "__main__":
    program()
# program_test.py
import unittest
import program

class TestProgram(unittest.TestCase):
    def setUp(self):
        self.argv_list = ["--key", "somefile.txt", "--output", "myresultfile.txt"]

    def test_program_stuff(self):
        # See "Things I've tried"
        program.writefile(...)

このコードをpython3 -m unittest -v program_test.pyで実行すると、python3 -m unittest: error: unrecognized arguments: -v program_test.pyというエラーメッセージが表示されます。

解決法

この問題は、argparseがコマンドライン引数を解析するときにunittestの引数(この場合は-vprogram_test.py)を認識できないために発生します。

この問題を解決するためには、unittestが実行されるときにargparseが引数を解析しないようにする必要があります。具体的には、parse.parse_args()if __name__ == "__main__":ブロック内に移動させることで解決できます。

修正後のコードは以下のようになります。

# program.py
import argparse

def program(args):
    # Use args here

def writefile(args):
    # Uses args and write to file

if __name__ == "__main__":
    parse = argparse.ArgumentParser(description="Command line program.")
    parse.add_argument("--key", type=str, help="Enter key")
    parse.add_argument("--output", type=str, help="Path to place results.")
    args = parse.parse_args()
    program(args)

このように修正することで、unittestを実行するときにargparseが引数を解析しないようになり、unrecognized argumentsエラーを回避できます。

以上が、Pythonのunittestでunrecognized argumentsエラーが発生したときの解決法です。この情報がPythonのunittestを使用する際の助けになれば幸いです。

投稿者 admin

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です