Для моего проекта я хотел создать подкласс для opencv VideoCapture, который выглядит следующим образом:
import cv2
class VideoOperator(cv2.VideoCapture):
def __init__(self, video_path):
super().__init__(video_path)
self.current_frame_index = 0
self.last_frame_index = int(self.get(cv2.CAP_PROP_FRAME_COUNT) - 1)
def move_to_frame(self, frame_index):
if frame_index > self.last_frame_index:
self.set(cv2.CAP_PROP_POS_FRAMES, self.last_frame_index)
self.current_frame_index = self.last_frame_index
elif frame_index < 0:
self.set(cv2.CAP_PROP_POS_FRAMES, 0)
self.current_frame_index = 0
else:
self.set(cv2.CAP_PROP_POS_FRAMES, frame_index)
self.current_frame_index = frame_index
def move_x_frames(self, x):
self.move_to_frame(self.current_frame_index + x)
def get_current_frame(self):
_, image = self.read()
self.move_to_frame(self.current_frame_index)
return image
Тогда я написал несколько тестов, используя unittest. Поскольку мне нужен свежий экземпляр моего подкласса, я решил создать его в функции setUp()
. Тесты (неполные) выглядят следующим образом:
import unittest, time
import video_operator
class TestVideoOperator(unittest.TestCase):
def setUp(self):
self.vid_op = video_operator.VideoOperator(r'E:\PythonProjects\video_cutter\vid1.mp4')
def tearDown(self):
self.vid_op.release()
def test_init(self):
self.assertEqual(self.vid_op.current_frame_index, 0)
self.assertEqual(self.vid_op.last_frame_index, 430653)
def test_move_to_existing_frame(self):
self.vid_op.move_to_frame(100)
self.assertEqual(self.vid_op.current_frame_index, 100)
def test_move_to_negative_frame(self):
self.vid_op.move_to_frame(-100)
self.assertEqual(self.vid_op.current_frame_index, 0)
def test_move_to_non_existing_frame(self):
self.vid_op.move_to_frame(self.vid_op.last_frame_index + 100)
self.assertEqual(self.vid_op.current_frame_index, self.vid_op.last_frame_index)
if __name__ == '__main__':
unittest.main()
Но несмотря на то, что есть 4 теста, выполняется только 1, и он всегда заканчивается информацией о некотором коде выхода, подобном этому:
Когда я просто определяю vid_op как поле класса и не пытаюсь инициализировать его в начале каждого теста, все работает отлично. Разве невозможно создать несколько экземпляров класса VideoCapture, хотя я выпускаю каждый из них перед созданием другого? Или проблема где-то еще?