Запустите unittest.main () из задачи вызова Python - PullRequest
0 голосов
/ 09 мая 2018

Я пытаюсь запустить несколько тестов юнит-тестов через библиотеку Python Invoke , но мое плохое знание Python мешает мне сделать это.

Вот пример кода, который у меня есть:

my_tests.py

import unittest

class TestStringMethods(unittest.TestCase):

    def test_upper(self):
        self.assertEqual('foo'.upper(), 'FOO')

    def test_isupper(self):
        self.assertTrue('FOO'.isupper())
        self.assertFalse('Foo'.isupper())

    def test_split(self):
        s = 'hello world'
        self.assertEqual(s.split(), ['hello', 'world'])
        # check that s.split fails when the separator is not a string
        with self.assertRaises(TypeError):
            s.split(2)

def main():
    unittest.main()

if __name__ == '__main__':
    main()

tasks.py

from invoke import task

@task
def tests(ctx):
    main()

@task
def other_task(ctx):
    print("This is fine")

def main():
    import my_tests
    import unittest
    unittest.main(module='my_tests')

if __name__ == '__main__':
    main()

И вот что я получаю:

C:\ittle_projects\invoke_unittest>python my_tests.py
...
----------------------------------------------------------------------
Ran 3 tests in 0.002s

OK

C:\ittle_projects\invoke_unittest>python tasks.py
...
----------------------------------------------------------------------
Ran 3 tests in 0.001s

OK

C:\ittle_projects\invoke_unittest>inv tests
E
======================================================================
ERROR: tests (unittest.loader._FailedTest)
----------------------------------------------------------------------
AttributeError: module 'my_tests' has no attribute 'tests'

----------------------------------------------------------------------
Ran 1 test in 0.001s

FAILED (errors=1)

Тесты запускаются нормально из my_tests.py и tasks.py, но когда я использую, вызывать перерывы в вещах. Как я могу заставить это работать или где я должен смотреть дальше?

1 Ответ

0 голосов
/ 09 мая 2018

Проблема, с которой вы сталкиваетесь, заключается в том, что unittest.main() использует аргументы командной строки, с которыми вызывается ваша программа, чтобы определить, какие тесты нужно запустить. Поскольку ваша программа выполняется как inv tests, первый аргумент вашей программы - tests, поэтому unittest пытается запустить тесты для имени модуля tests, которого не существует.

Вы можете обойти это, вытолкнув последний аргумент (tests) из списка системных аргументов :

import sys

from invoke import task

@task
def tests(ctx):
    # Pop "tests" off the end of the system arguments
    sys.argv.pop()
    main()

@task
def other_task(ctx):
    print("This is fine")

def main():
    import my_tests
    import unittest
    unittest.main(module='my_tests')

if __name__ == '__main__':
    main()
...