当我在我的python代码中使用argparse时,无法运行nosetests

问题描述 投票:5回答:2

在我的主要代码中,我有这个:

  #comp.py
  parser = ArgumentParser()
  parser.add_argument("-n", dest="deg", default=100,type=int, help="setup value of deg")
  parser.add_argument("-k", dest="k", default=25, type=float, help="setup value of k")
  parser.add_argument("-l", dest="l", default=0, type=int, help="setup value of l")
  args = parser.parse_args()

  def afunc(x):
      ...
      #do something with k, l, deg and the return the result
      ...
      return result

和我的测试文件verify.py

  #verify.py
  import unittest
  import comp
  class TestFuncs(unittest.TestCase):
      def test_afunc(self):
          self.assertEqual(afunc(0), 0)
          self.assertEqual(afunc(1), 0)
          self.assertEqual(afunc(1), 1)
          self.assertEqual(afunc(3.2), 1)
...

当我试图运行nosetests来测试函数afunc(...)的结果时,我收到了这个错误:

machine:project user$ nosetests verify
usage: nosetests [-h] [-n DEG] [-k K] [-l L]
nosetests: error: unrecognized arguments: verify

如何解决这个问题呢?

python unit-testing parsing command-line nose
2个回答
6
投票

好的,我刚刚通过添加几行if else条件解决了这个问题。

它似乎是我的测试文件(verify.py)无法管理comp.py中解析器部分的值赋值。所以,我只是添加一些条件来分配degkl的值,以防comp.py不作为主函数运行。

#comp.py
if __name__ == "__main__":
    parser = ArgumentParser()
    parser.add_argument("-n", dest="deg", default=100,type=int, help="setup value of deg")
    parser.add_argument("-k", dest="k", default=25, type=float, help="setup value of k")
    parser.add_argument("-l", dest="l", default=0, type=int, help="setup value of l")
    args = parser.parse_args()
else:
    deg=100
    k=25
    l=0

def afunc(x):
    ...
    #do something with k, l, deg and the return the result
    ...
    return result

3
投票

Updated comp.py

  • 仅从if __name__ == "__main__"块运行实际代码。这样可以在作为脚本调用时安全地导入模块并运行代码
  • 单独的参数解析为main函数
  • 保持测试的afunc尽可能独立于其余部分,因此期望所有需要的输入都通过参数传递,而不是通过sys.argv或其他全局状态传递。这使您的功能更加可测试

代码如下:

from argparse import ArgumentParser

def main():
    parser = ArgumentParser()
    parser.add_argument("-n", dest="deg", default=100,type=int, help="setup value of deg")
    parser.add_argument("-k", dest="k", default=25, type=float, help="setup value of k")
    parser.add_argument("-l", dest="l", default=0, type=int, help="setup value of l")
    args = parser.parse_args()

def afunc(x):
    return 2 * x

if __name__ == "__main__":
    main()

Updated veryfi.py => test_it.py

  • 调用文件test_(something).py。然后Nose会自动发现文件。
  • 定义测试的明确焦点,在这种情况下忽略参数解析并仅测试afunc
  • (推荐)拆分为较小的测试用例 - 您的测试运行报告会告诉您更好,出了什么问题。
  • (鼻子特征)使用测试生成器,如test_with_gen所示。
  • 可能将测试移到tests子目录中。只是一个习惯。它允许将nose定位到更精确的测试。

这是更新的test_it.py

import unittest
from comp import afunc

class TestFuncs(unittest.TestCase):
  def test_afunc(self):
      self.assertEqual(afunc(0), 0)
      self.assertEqual(afunc(1), 2)
      self.assertEqual(afunc(2), 4)
      self.assertEqual(afunc(3.2), 6.4)

def test_case_0():
    assert afunc(0) == 0

def test_case_1():
    assert afunc(1) == 2

def test_with_gen():
    plan = [(0, 0), (1, 2), (2, 4), (3.2, 6.4)]
    for arg, expected in plan:
        yield check_afunc, arg, expected

def check_afunc(arg, expected):
    assert afunc(arg) == expected

运行测试:

$ nosetests -v
test_afunc (test_it.TestFuncs) ... ok
test_it.test_case_0 ... ok
test_it.test_case_1 ... ok
test_it.test_with_gen(0, 0) ... ok
test_it.test_with_gen(1, 2) ... ok
test_it.test_with_gen(2, 4) ... ok
test_it.test_with_gen(3.2, 6.4) ... ok

----------------------------------------------------------------------
Ran 7 tests in 0.005s

OK
© www.soinside.com 2019 - 2024. All rights reserved.