Рубрики
Без рубрики

Python Unittest 의 прицел приспособления

Инструмент тестирования Python Python 에는 알려져 사용 되는 여러 도구들 이 이미 많습니다 많습니다. 특히 pytest 는 좀 직관 적 인 인 assert 구문과 … Tagged с помощью Python, Testing, Unittest, приспособления.

Инструмент тестирования Python

Python 에는 알려져 사용 되는 여러 도구들 이 이미 많습니다. 특히 Pytest 는 좀 직관 적 인 인 a Assert 구문과 тест 결과 를 하며 하며, 많은 плагин 을 보유 하고 있습니다. 하지만 여러 을 알아보기 전 에 에 Python Testing 에 기반이 되는 Unittest 프레임워크 개념 과 사용법 에 대해 알아보겠습니다.

오늘 은 중 중 의 종류 와 사용 범위 에 대해 알아보겠습니다 알아보겠습니다.

Тестовый прибор

테스트 픽스쳐 테스트 를 수행 시 필요 한 리소스 준비 과 이 정리 하는 동작 에 해당 합니다. Unittest 프레임워크 는 는 를 를 여러 여러 에서 사용 할 수 있도록 을 제공 합니다. 아래 에서 Тест, класс, модуль сфера применения 를 위한 사용법 사용법 에 대해 알아보겠습니다.

Тестовый прицел

Testcase 의 각 에서 사용 될 될 의 준비 와 정리 는 는 setup () 과 teardown () 을 사용 하게 됩니다. 테스트 마다 반복 수 있는 있는 를 를 setup () 메소드 와 deplowdown () 메소드 사용 해 분리 할 수 있습니다 있습니다. 테스트 프레임워크 각 테스트 실행 전후 에 두 메소드 를 자동 으로 호출 합니다.

import unittest


class RemainderTest(unittest.TestCase):
  def setUp(self) -> None:
    self.number = 2
    print('setUp')

  def tearDown(self) -> None:
    print('tearDown')

  def test_even(self):
    self.assertEqual(self.number % 2, 0)

  def test_odd(self):
    self.assertNotEqual(self.number % 2, 1)

위 테스트 를 한 결과 를 통해 각 테스트별로 매번 매번 가 되는 것 을 알 수 있습니다.

setUp
tearDown
setUp
tearDown

setup () 메소드 에서 예외가 발생 하면 하면 слеза 메소드는 호출 되지 않습니다.

class RemainderTest(unittest.TestCase):
    def setUp(self) -> None:
        self.number = 2
        print('setUp')
        raise Exception()

    def tearDown(self) -> None:
        print('tearDown')

    def test_even(self):
        self.assertEqual(self.number % 2, 0)

    def test_odd(self):
        self.assertNotEqual(self.number % 2, 1)
setUp
Error
Traceback (most recent call last):
...
setUp
Error
Traceback (most recent call last):
...

Настройка 메소드 이 성공 했다면 테스트 실패 여부 과 관계 없이 Teardown 메소드 호출 됩니다.

테스트 중 사용 된 자원 을 정리 하기 위해 разрыв 이후 불리는 함수 를 추가 할 수 있습니다. 추가 된 순서 반대 순서 (Lifo) 로 불리게 됩니다. 함수가 추가 때 때 addCleanup 에 전달 된 위치 인자 나 키워드 인자 와 함께 호출 됩니다.

def cleanUp():
    print('cleanUp')


class RemainderTest(unittest.TestCase):
    def setUp(self) -> None:
        self.number = 2
        print('setUp')
        self.addCleanup(cleanUp)

    def tearDown(self) -> None:
        print('tearDown')

    def test_even(self):
        self.assertEqual(self.number % 2, 0)
setUp
tearDown
cleanUp

또한 Настройка 메소드 예외가 발생 하면 하면 메소드 가 호출 되지 않아도 않아도 않아도 않아도 메소드 실행 실행 됩니다.

def cleanUp():
    print('cleanUp')


class RemainderTest(unittest.TestCase):
    def setUp(self) -> None:
        self.number = 2
        print('setUp')
        self.addCleanup(cleanUp)
        raise Exception()

    def tearDown(self) -> None:
        print('tearDown')

    def test_even(self):
        self.assertEqual(self.number % 2, 0)
setUp
cleanUp

Error
Traceback (most recent call last):

Docleanup 메소드 직접 호출 하여 odcleanup 에 된 함수들 을 을 호출 이전 에 정리 할 수도 있습니다 있습니다.

def cleanUp():
    print('cleanUp')


class RemainderTest(unittest.TestCase):
    def setUp(self) -> None:
        self.number = 2
        print('setUp')
        self.addCleanup(cleanUp)

    def tearDown(self) -> None:
        print('tearDown')

    def test_even(self):
        self.assertEqual(self.number % 2, 0)
        self.doCleanups()
setUp
cleanUp
tearDown

Класс Объем

Тестовый класс 범위 에 에 는 는 Unittest. TestSuite 에 의해 되는 되는 SetupClass 와 DeplowdOnclass 가 있습니다. 해당 приспособление 는 тестовый класс 의 테스트 와 공유 되는 점 을 을 주의 해야 합니다. 아래 와 같이 테스트 에서 에서 에서 에서 의 의 이 일어나게 되면 이후 테스트 에 을 을 미치게 됩니다.

class JoinTest(unittest.TestCase):
    @classmethod
    def setUpClass(cls) -> None:
        cls.str_list = ['foo', 'bar']
        print('setUpClass')

    @classmethod
    def tearDownClass(cls) -> None:
        print('tearDownClass')

    def test_join_with_colon(self):
        expected = 'foo:bar'
        self.assertEqual(':'.join(self.str_list), expected)
        self.str_list.append('baz')

    def test_join_with_comma(self):
        expected = 'foo,bar'
        self.assertEqual(','.join(self.str_list), expected)
        self.str_list.append('baz')

Setupclass 메소드 에서 예외가 발생 하면 하면 DeplowdlayClass 메소드는 호출 되지 않습니다.

Тестовая прицел 와 마찬가지 로 Очистка 을 위한 addclasscleanup 메소드 를 제공 합니다. Setupclass 메소드 예외가 발생 하면 하면 Deplowdlassclass 메소드 호출 되지 않아도 않아도 Doclascleanups 메소드 가 실행 됩니다.

def classCleanUp():
    print('classCleanUp')


class JoinTest(unittest.TestCase):
    @classmethod
    def setUpClass(cls) -> None:
        cls.str_list = ['foo', 'bar']
        print('setUpClass')
        cls.addClassCleanup(classCleanUp)

    @classmethod
    def tearDownClass(cls) -> None:
        print('tearDownClass')

    def test_join_with_colon(self):
        expected = 'foo:bar'
        self.assertEqual(':'.join(self.str_list), expected)

addClassCleanup 에 된 함수들 을 을 Deplowdlass 이전 에 정리 싶다면 싶다면 싶다면 싶다면 싶다면 싶다면 싶다면 싶다면 싶다면 싶다면 싶다면 싶다면 싶다면 싶다면 싶다면 싶다면 싶다면 싶다면 싶다면 싶다면 싶다면 싶다면 싶다면 싶다면 싶다면 하고 하고 싶다면 있습니다 있습니다 있습니다 있습니다.

Модуль область применения

Область модуля 에서 는 setupmodule 과 Depdownmodule 을 하며 함수로 작성 되어야 합니다 합니다. 마찬가지 로 setupmodule 실행 중 발생 하면 하면 Depdownmodule 함수 호출 되지 않습니다.

def setUpModule():
    print('setUpModule')


def tearDownModule():
    print('tearDownModule')


class JoinTest(unittest.TestCase):
    def test_join_with_colon(self):
        expected = 'foo:bar'
        self.assertEqual(':'.join(['foo', 'bar']), expected)


class RemainderTest(unittest.TestCase):
    def test_even(self):
        self.assertEqual(2 % 2, 0)
setUpModule
tearDownModule

Прицел модуля 에 Очистка 을 위해 Unittest.AddmoduleCleanup 함수 를 제공 합니다. DepdownModule 함수가 호출 이후 이후 Unittest.case.DomoDuleCleanups 함수 통해 추가 된 된 함수들이 호출 됩니다 됩니다.

def setUpModule():
    print('setUpModule')


def tearDownModule():
    print('tearDownModule')


def moduleCleanUp():
    print('moduleCleanUp')


class JoinTest(unittest.TestCase):
    def test_join_with_colon(self):
        expected = 'foo:bar'
        self.assertEqual(':'.join(['foo', 'bar']), expected)
        unittest.addModuleCleanup(moduleCleanUp)
setUpModule
tearDownModule
moduleCleanUp

Depdownmodule 이 되기 전 에 추가 된 정리 함수들 을 호출 하고 싶다면 nititest.case.modulecleanups 함수 를 직접 호출 합니다.

def setUpModule():
    print('setUpModule')


def tearDownModule():
    print('tearDownModule')


def moduleCleanUp():
    print('moduleCleanUp')


unittest.addModuleCleanup(moduleCleanUp)


class JoinTest(unittest.TestCase):
    def test_join_with_colon(self):
        expected = 'foo:bar'
        self.assertEqual(':'.join(['foo', 'bar']), expected)
        unittest.case.doModuleCleanups()


class RemainderTest(unittest.TestCase):
    def test_even(self):
        self.assertEqual(2 % 2, 0)
setUpModule
moduleCleanUp
tearDownModule

전체 적 인 приспособление для приспособления 흐름

def setUpModule():
    print('setUpModule')


def tearDownModule():
    print('tearDownModule')


def cleanUp():
    print('cleanUp')


def classCleanUp():
    print('classCleanUp')


def moduleCleanUp():
    print('moduleCleanUp')


unittest.addModuleCleanup(moduleCleanUp)


class JoinTest(unittest.TestCase):
    def setUp(self) -> None:
        print('setUp')
        self.addCleanup(cleanUp)

    def tearDown(self) -> None:
        print('tearDown')

    @classmethod
    def setUpClass(cls) -> None:
        print('setUpClass')
        cls.addClassCleanup(classCleanUp)

    @classmethod
    def tearDownClass(cls) -> None:
        print('tearDownClass')

    def test_join_with_colon(self):
        expected = 'foo:bar'
        self.assertEqual(':'.join(['foo', 'bar']), expected)

위 에서 된 된 된 를 모두 포함 한 결과 를 보면 호출 순서 는 아래 와 같습니다.

setUpModule
setUpClass
setUp
tearDown
cleanUp
tearDownClass
classCleanUp
tearDownModule
moduleCleanUp

정리

Python Unittest 를 해 테스트 작성 시 시 시 별 별 와 시점 과 조건 을 잘 파악 해야 합니다 합니다. 여러 Прицел 의 의 를 활용 하면 중복 을 해결 하고 테스트 성능 에 도움 되지만 잘못 사용 할 경우 의도 와 다른 결과 가 출력 수 있음 에 하며 사용 하는 것 이 좋습니다 좋습니다 좋습니다 좋습니다 좋습니다 좋습니다 출력 될 있음 에

참고

Оригинал: “https://dev.to/ddangdol/python-unittest-fixture-scope-593a”