Не удается запустить nosetests, когда я использую argparse в своем коде python

#python #unit-testing #parsing #command-line #nose

#python #модульное тестирование #синтаксический анализ #командная строка #нос

Вопрос:

В моем основном коде у меня есть это:

   #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
  

Как решить эту проблему?

Комментарии:

1. Как именно вы начинаете nose ? Каково имя файла, который вы хотите протестировать, и каково полное содержимое? (или контент как можно короче, но все равно показывает проблему). Что вы ожидаете сделать nose ?

2. Похоже nosetests , исполняемый файл считает verify , что это аргумент, а не файл. Возможно, вы могли бы указать полный путь к вашему verify.py файлу или запустить nosetests из более подходящего места?

3. @JanVlcinsky и Яни, пожалуйста, проверьте мой ответ, это работает для меня. Если у вас есть какие-либо дополнительные идеи, пожалуйста, добавьте несколько ответов или оставьте несколько комментариев, спасибо за вашу помощь.

4. @teces907 На самом деле, проблема может быть намного проще — ваш вызов nosetests передает аргумент verify , и он должен быть verify.py

5. @terces907 Не нужно извиняться за плохой опыт. Вы улучшаете его, и на самом деле это бесконечный итеративный процесс.

Ответ №1:

Хорошо, я просто решил проблему, добавив несколько строк условия if else.

Похоже, что мой тестовый файл ( verify.py ) не может управлять присвоением значения в разделе синтаксического comp.py анализатора. Итак, я просто добавляю некоторое условие ниже, чтобы присвоить значения deg , k , l на случай, если это 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
  

Ответ №2:

Обновлено 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()
  

Обновлено veryfi.py => test_it.py

  • вызовите файл test_(something).py . Затем Nose автоматически обнаружит файл.
  • определите четкий фокус вашего теста, в этом случае игнорируйте синтаксический анализ аргументов и тестируйте только afunc
  • (рекомендуется) разделить на меньшие тестовые примеры — ваш отчет о тестовом запуске расскажет вам намного лучше, что на самом деле пошло не так.
  • (функция nose) используйте генератор тестов, как показано на 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