#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