Проблема с использованием абстрактного класса с Unittest [Duplicate]JAVA

Программисты JAVA общаются здесь
Anonymous
Проблема с использованием абстрактного класса с Unittest [Duplicate]

Сообщение Anonymous »

Я реализовал стек в Python, используя «абстрактные классы» схожи с поведением Java Interfaces. Теперь я пытаюсь выяснить, как решить проблему с моими тестами. Поскольку я должен подражать структуре Java здесь, я использую Pyhamcrest, потому что Hamcrest использовался в Java, а также базовый маттер и поставщик. Я использую Unittest для тестов. < /P>
Я использую абстрактный тестовый файл в качестве поставщика. Этот файл должен быть выполнен только из его подклассов, но никогда не напрямую. У меня есть 3 файла в/src/test/stach:
stack_test_case.py (это абстрактный класс)

Код: Выделить всё

import unittest
from abc import ABC
from copy import deepcopy
from hamcrest import assert_that, is_
from src.main.common.empty_exception import EmptyException
from src.test.stack.test_is_equal_to_stack import is_equal_to_stack

class AbstractStackTestCase(unittest.TestCase, ABC):

def create_stack(self):
raise NotImplementedError("Debe ser implementado por la subclase.")

def create_stack_with(self, *values):
stack = self.create_stack()
for value in values:
stack.push(value)
return stack

def test_is_empty_empty_stack(self):
stack = self.create_stack()
assert_that(stack.is_empty(), is_(True))

def test_is_empty_non_empty_stack(self):
stack = self.create_stack()
stack_copy = deepcopy(stack)
stack_copy.push(10)
assert_that(stack_copy.is_empty(), is_(False))

def test_size_empty_stack(self):
stack = self.create_stack()
assert_that(len(stack), is_(0))

def test_size_non_empty_stack(self):
stack = self.create_stack_with(10, 11, 12, 13, 14, 15)
assert_that(len(stack), is_(6))

def test_top_empty_stack(self):
stack = self.create_stack()
with self.assertRaises(EmptyException):
_ = stack.top

def test_top_non_empty_stack(self):
stack = self.create_stack_with(10, 11, 12, 13, 14, 15)
assert_that(stack.top, is_(15))

def test_push_none(self):
stack = self.create_stack()
with self.assertRaises(ValueError):
stack.push(None)

def test_push_empty_stack(self):
original = self.create_stack_with(10)
expected = self.create_stack()
expected.push(10)
assert_that(original, is_(is_equal_to_stack(expected)))

def test_push_non_empty_stack(self):
original = self.create_stack_with(10, 11, 12, 13, 14, 15)
expected = self.create_stack_with(10, 11, 12, 13, 14)
expected.push(15)
assert_that(original, is_(is_equal_to_stack(expected)))

def test_pop_empty_stack(self):
stack = self.create_stack()
with self.assertRaises(EmptyException):
stack.pop()

def test_pop_non_empty_stack(self):
expected = self.create_stack_with(10, 11, 12, 13, 14, 15)
actual = self.create_stack_with(10, 11, 12, 13, 14, 15, 16)
assert_that(actual.pop(), is_(16))
assert_that(actual, is_(is_equal_to_stack(expected)))

def test_clear(self):
stack = self.create_stack_with(10, 11, 12, 13, 14, 15)
stack.clear()
assert_that(stack.is_empty(), is_(True))
test_linked_stack_case.py

Код: Выделить всё

import unittest
from src.main.stack.linked_stack import LinkedStack
from src.test.stack.stack_test_case import AbstractStackTestCase

class TestLinkedStackCase(AbstractStackTestCase):
def create_stack(self):
return LinkedStack()

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

Код: Выделить всё

import unittest
from typing import TypeVar, Generic
from hamcrest import assert_that, is_
from hamcrest.core.base_matcher import BaseMatcher
from hamcrest.core.description import Description
from copy import deepcopy

from src.main.stack.stack import Stack
from src.main.stack.linked_stack import LinkedStack

T = TypeVar("T")

class IsEqualToStack(BaseMatcher, Generic[T]):
def __init__(self, expected: Stack[T]):
self.expected = expected

def _matches(self, actual: Stack[T]) -> bool:
if len(self.expected) != len(actual):
return False

expected_copy = deepcopy(self.expected)
actual_copy = deepcopy(actual)

while not expected_copy.is_empty() and not actual_copy.is_empty():
if expected_copy.pop() != actual_copy.pop():
return False

return expected_copy.is_empty() and actual_copy.is_empty()

def describe_to(self, description: Description) -> None:
description.append_text("equal stacks")

def is_equal_to_stack(expected: Stack[T]) ->  IsEqualToStack[T]:
return IsEqualToStack(expected)

class TestIsEqualToStackMatcher(unittest.TestCase):
def test_equal_stacks(self):
stack1 = LinkedStack()
stack2 = LinkedStack()
for val in [1, 2, 3]:
stack1.push(val)
stack2.push(val)

matcher = is_equal_to_stack(stack1)
assert_that(matcher._matches(stack2), is_(True))

def test_unequal_stacks(self):
stack1 = LinkedStack()
stack2 = LinkedStack()
for val in [1, 2, 3]:
stack1.push(val)
for val in [1, 2, 4]:
stack2.push(val)

matcher = is_equal_to_stack(stack1)
assert_that(matcher._matches(stack2), is_(False))

if __name__ == "__main__":
unittest.main()
< /code>
Теперь я запускаю следующую команду из базового каталога: < /p>
python -m unittest discover -s src/test/stack -p "test_*.py" -v
Но тесты абстрактного тестового файла выполняются, поскольку в терминале печатается notimplementError . Мне нужны работающие тесты и тест из абстрактного тестового файла, выполняемого из двух других тестовых файлов.

Подробнее здесь: https://stackoverflow.com/questions/795 ... h-unittest

Вернуться в «JAVA»