Фантомные тесты после переключения с unittest.TestCase на tf.test.TestCase - PullRequest
1 голос
/ 29 марта 2019

Следующий код:

class BoxListOpsTest(unittest.TestCase):                                                                                                                                                                                                                              
    """Tests for common bounding box operations."""                                                                                                                                                                                                                   

    def test_area(self):                                                                                                                                                                                                                                              
        corners = tf.constant([[0.0, 0.0, 10.0, 20.0], [1.0, 2.0, 3.0, 4.0]])                                                                                                                                                                                         
        exp_output = [200.0, 4.0]                                                                                                                                                                                                                                     
        boxes = box_list.BoxList(corners)                                                                                                                                                                                                                             
        areas = box_list_ops.area(boxes)                                                                                                                                                                                                                              

        with tf.Session() as sess:                                                                                                                                                                                                                                    
            areas_output = sess.run(areas)                                                                                                                                                                                                                            
            np.testing.assert_allclose(areas_output, exp_output)                                                                                                                                                                                                      


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

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

.
----------------------------------------------------------------------
Ran 1 test in 0.471s

OK

Однако при переключении на tf.test.TestCase:

class BoxListOpsTest(tf.test.TestCase):                                                                                                                                                                                                                               
    """Tests for common bounding box operations."""                                                                                                                                                                                                                   

    def test_area(self):                                                                                                                                                                                                                                              
        corners = tf.constant([[0.0, 0.0, 10.0, 20.0], [1.0, 2.0, 3.0, 4.0]])                                                                                                                                                                                         
        exp_output = [200.0, 4.0]                                                                                                                                                                                                                                     
        boxes = box_list.BoxList(corners)                                                                                                                                                                                                                             
        areas = box_list_ops.area(boxes)                                                                                                                                                                                                                              
        # with self.session() as sess:                                                                                                                                                                                                                                
        with tf.Session() as sess:                                                                                                                                                                                                                                    
            areas_output = sess.run(areas)                                                                                                                                                                                                                            
            np.testing.assert_allclose(areas_output, exp_output)                                                                                                                                                                                                      


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

вводит какой-то второй тест, который пропускается:

.s
----------------------------------------------------------------------
Ran 2 tests in 0.524s

OK (skipped=1)

Каково происхождение второго теста и стоит ли беспокоиться об этом?

Я использую TensorFlow 1.13.

1 Ответ

1 голос
/ 31 марта 2019

Это метод tf.test.TestCase.test_session. Из-за неудачного именования unittest считает метод test_session тестом и добавляет его в набор тестов. Чтобы предотвратить запуск test_session в качестве теста, Tensorflow должен пропустить его изнутри, что приводит к «пропущенному» тесту:

def test_session(self,
                 graph=None,
                 config=None,
                 use_gpu=False,
                 force_gpu=False):
    if self.id().endswith(".test_session"):
        self.skipTest("Not a test.")

Убедитесь, что пропущенный тест является test_session, запустив тест с флагом --verbose. Вы должны увидеть вывод, похожий на этот:

...
test_session (BoxListOpsTest)
Use cached_session instead. (deprecated) ... skipped 'Not a test.'

Хотя test_session устарел с 1.11 и должен быть заменен на cached_session ( связанный коммит ), на данный момент его удаление в 2.0 пока не запланировано. Чтобы избавиться от него, вы можете применить пользовательский фильтр к собранным тестам.

unittest

Вы можете определить пользовательскую функцию load_tests:

test_cases = (BoxListOpsTest, )

def load_tests(loader, tests, pattern):
    suite = unittest.TestSuite()
    for test_class in test_cases:
        tests = loader.loadTestsFromTestCase(test_class)
        filtered_tests = [t for t in tests if not t.id().endswith('.test_session')]
        suite.addTests(filtered_tests)
    return suite

pytest

Добавьте пользовательский pytest_collection_modifyitems крючок в ваш conftest.py:

def pytest_collection_modifyitems(session, config, items):
    items[:] = [item for item in items if item.name != 'test_session']
...