Почему мои модульные тесты GNURadio проходят, когда они должны провалиться? - PullRequest
1 голос
/ 02 ноября 2019

При настройке модульного тестирования в GNURadio (версия 3.8, работающая на Python 3.6.8) метод assertFloatTuplesAlmostEqual, похоже, дает неправильные результаты.

Я работаю в учебнике GNURadio OutOfTreeModules, фокусируясьсейчас на модульном тестировании. В модульном тесте я приведу вектор ожидаемых и реальных результатов. (Известно, что код, который я тестирую, работает правильно). В тесте используется инструкция self.assertFloatTuplesAlmostEqual(expected_result, result_data, 6). Кажется, оператор assert проверяет только первый элемент в векторе;если я сделаю ожидаемое значение любого другого элемента в векторе отличным от фактического, тест пройден. Я не могу найти никакой документации по методу assertFloatTuplesAlmostEqual. Вот код для модульного теста:

from gnuradio import blocks
import howto1_swig as howto1

class qa_cube_ff(gr_unittest.TestCase):

    def setUp(self):
        self.tb = gr.top_block()



    def test_001_cube_ff(self):
        print("test 001 STARTING")
        src_data = (-3, 4, -5.5 )
        print(src_data)
#        expected_result = (-27, 60, 166.375)    // these would be the correct answers
# below, only the first expected result is correct; the other 2 are intentionally wrong
        expected_result = (-27, 60, 100.375)
        src = blocks.vector_source_f(src_data)
        sqr = howto1.cube_ff()
        dst = blocks.vector_sink_f()
        self.tb.connect(src, sqr)
        self.tb.connect(sqr, dst)
        self.tb.run()
        result_data = dst.data()
        print("EXPECTED")
        print(expected_result)
        print("RESULT")
        print(result_data)
        self.assertFloatTuplesAlmostEqual(expected_result, result_data, 6)

    def tearDown(self):
        self.tb = None


if __name__ == '__main__':
    gr_unittest.run(qa_cube_ff) 

Здесь я пытаюсь запустить тест. Обратите внимание, что я вставил операторы print, чтобы показать ожидаемые и фактические результаты выполнения кода. Код assetFloatTuplesAmostEqual проверяет только первый элемент в векторе;если ожидаемые и фактические значения первого элемента не совпадают, тест не пройден (как и должно быть). Неправильные значения для любого другого элемента проходят тест-

odroid@odroid:~/projects/grc_module/gr-howto1/build$ ctest -VV -R cube
UpdateCTestConfiguration  from :/home/odroid/projects/grc_module/gr-howto1/build/DartConfiguration.tcl
UpdateCTestConfiguration  from :/home/odroid/projects/grc_module/gr-howto1/build/DartConfiguration.tcl
Test project /home/odroid/projects/grc_module/gr-howto1/build
Constructing a list of tests
Done constructing a list of tests
Updating test list for fixtures
Added 0 tests to meet fixture requirements
Checking test dependency graph...
Checking test dependency graph end
test 1
    Start 1: qa_cube_ff

1: Test command: /bin/sh "/home/odroid/projects/grc_module/gr-howto1/build/python/qa_cube_ff_test.sh"
1: Test timeout computed to be: 9.99988e+06
1: .
1: ----------------------------------------------------------------------
1: Ran 1 test in 0.003s
1: 
1: OK
1: test 001 STARTING
1: (-3, 4, -5.5)
1: EXPECTED
1: (-27, 60, 100.375)
1: RESULT
1: (-27.0, 64.0, -166.375)
1/1 Test #1: qa_cube_ff .......................   Passed    1.98 sec

The following tests passed:
    qa_cube_ff

100% tests passed, 0 tests failed out of 1

Total Test time (real) =   1.99 sec

Здесь первый элемент правильный (-3 в кубе). Два других не правы.

Почему? Смежный вопрос: Может кто-нибудь посоветовать мне, где найти документацию для методов gr_unittest ??

1 Ответ

0 голосов
/ 03 ноября 2019

Кажется, что оператор assert проверяет только первый элемент в векторе;если я сделаю ожидаемое значение любого другого элемента в векторе отличным от фактического, тест пройден

Это звучит как ошибка, рассмотрите возможность сообщения об этом в https://github.com/gnuradio/gnuradio/issues

Не могу найти документацию по методу assertFloatTuplesAlmostEqual. Смежный вопрос: Может кто-нибудь посоветовать мне, где найти документацию для методов gr_unittest ??

Иногда лучшей документацией является сам исходный код - https://github.com/gnuradio/gnuradio/blob/maint-3.8/gnuradio-runtime/python/gnuradio/gr_unittest.py#L104-L123

def assertFloatTuplesAlmostEqual(self, a, b, places=7, msg=None):
    """
    Fail if the two real-valued tuples are not approximately equal.
    Approximate equality is determined by specifying the number of decimal
    places.
    """
    self.assertEqual(len(a), len(b))
    return all((
        self.assertAlmostEqual(x, y, places, msg)
        for (x, y) in zip(a, b)
    ))


def assertFloatTuplesAlmostEqual2(self, a, b,
                                  abs_eps=1e-12, rel_eps=1e-6, msg=None):
    self.assertEqual(len(a), len(b))
    return all((
        self.assertComplexAlmostEqual2(x, y, abs_eps, rel_eps, msg)
        for (x, y) in zip(a, b)
    ))
...