Показать запись массива, вызывающую сбой теста - PullRequest
0 голосов
/ 19 марта 2020

Как часть набора тестирования, я должен проверить, верен ли массив numpy, возвращаемый функцией. Эту проверку легко выполнить, используя np.array_equal, который возвращает логическое значение того, являются ли все элементы массива одинаковыми.

Если тест не пройден, сообщение об ошибке не особенно полезно для понимания причины ошибки. .

import unittest
import numpy as np

class TestArray(unittest.TestCase):
    def test_values(self):
        x = np.array([1, 2])
        self.assertTrue(np.array_equal(x, [1, 3]))


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

Сообщение об ошибке теста:

Traceback (most recent call last):
  File "test.py", line 7, in test_values
    self.assertTrue(np.array_equal(x, [1, 3]))
AssertionError: False is not true

Есть ли простой способ проверить, равны ли записи, показывает ли индекс и значение первой записи, которая не равна? Я хочу сообщение об ошибке вроде:

AssertionError: Arrays not equal at index 1 (2 != 3) 

1 Ответ

1 голос
/ 19 марта 2020

С np.array_equal мы можем взять код и переписать его, чтобы добавить еще одну проверку в конце

def array_equal(a1, a2):
    try:
        a1, a2 = asarray(a1), asarray(a2)
    except Exception:
        return False
    if a1.shape != a2.shape:
        return False
    eq = asarray(a1 == a2) # [ True False False True]
    if not bool(eq.all()):
        errors = [f"idx:{idx} ({vals[0]}!={vals[1]})"
                  for idx, vals in enumerate(zip(a1, a2))
                  if not eq[idx]]
        raise AssertionError("Arrays not equal " + " ".join(errors))
    return True

class TestArray(unittest.TestCase):
    def test_values(self):
        x = np.array([1, 1, 1, 1])
        self.assertTrue(array_equal(x, [1, 2, 3, 1]))

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

Дает AssertionError: Arrays not equal idx:1 (1!=2) idx:2 (1!=3)

...