2012-05-29 4 views
0

Поддержка Deo python setUp() и tearDown() действует по-разному в зависимости от контекста? Все средства, я спрашиваю о том, могу ли я сделать что-то вроде этого:python - unitest setUp tearDown в разных контекстах

setUp() { 
    if(context1){ 
     do A; 
    } 
    else{ 
     do B; 
    } 
} 


tearDown() { 
    if(context1){ 
     do A; 
    } 
    else{ 
     do B; 
    } 
} 
+2

Возможно, будет больше ответов, если вы разместите * код Python *. – PointedEars

+0

вы можете сделать это, имея контекст как глобальную переменную или переменную класса, установленную в 'setUpClass()', которая вызывается один раз перед каждым тестом. но точка светильников - это контекст. если вам нужно, что вам, вероятно, нужны два теста, нет? –

ответ

1

Да, и так же, как вы его показываете: используйте, если блоки, и делайте только определенные части установки, если условие истинно.

Я думаю, что у вас есть разные версии setUp и tearDown для различных тестов. Я бы на самом деле предположить, что вы либо:

  • разделить тесты на различные TestCase подклассов с соответствующими setUp/tearDown методов
  • или не используют setUp и tearDown на всех - сделать что-то вроде этого

    class MyTestCase: 
        def _setup_for_foo_tests(): 
         # blah blah blah 
        def _setup_for_bar_tests(): 
         # blah blah blah 
        def test_foo_1(): 
         self._setup_for_foo_tests() 
         # test code 
        def test_foo_2(): 
         self._setup_for_foo_tests() 
         # test code 
        def test_bar_1(): 
         self._setup_for_bar_tests() 
         # test code 
        # etc etc etc 
    
+0

Как насчет tearDown, предположим, что вы создали кучу тестовых файлов в настройке, вам также нужно написать _teardown_for_foo_tests? @AdamKG – Shengjie

+0

Да, это так. В этой технике есть отличный разговор [здесь] (http://pyvideo.org/video/634/speedily-practical-large-scale-tests), основная цель которого заключается в явном вызове кода установки/разрыва теста зависит от вместо того, чтобы неявно ожидать вызова setUp/tearDown, так как тогда становится трудно определить, нет ли ненужного (и потенциально трудоемкого) кода для данного теста. – AdamKG

2

Вы должны думать о делать 2 разных классы (возможно, с некоторым общим предком) тест для каждого контекста теста вам нужно, это было бы проще.

Что-то вроде этого:

class BaseTest(): 
    def test_01a(self): 
     pass 

class Context1TestCase(BaseTest, unittest.TestCase): 
    def setUp(self): 
     # do what you need for context1 

    def tearDown(self): 
     # do what you need for context1 

class Context2TestCase(BaseTest, unittest.TestCase): 
    def setUp(self): 
     # do what you need for context2 

    def tearDown(self): 
     # do what you need for context2 

таким образом, test_01a будет выполняться один раз в context1, один раз в context2.

Смежные вопросы