sqlmesh.core.test.result
1from __future__ import annotations 2 3import types 4import typing as t 5import unittest 6 7from sqlmesh.core.test.definition import ModelTest 8 9if t.TYPE_CHECKING: 10 ErrorType = t.Union[ 11 t.Tuple[type[BaseException], BaseException, types.TracebackType], 12 t.Tuple[None, None, None], 13 ] 14 15 16class ModelTextTestResult(unittest.TextTestResult): 17 successes: t.List[unittest.TestCase] 18 19 def __init__(self, *args: t.Any, **kwargs: t.Any): 20 self.console = kwargs.pop("console", None) 21 super().__init__(*args, **kwargs) 22 self.successes = [] 23 self.original_failures: t.List[t.Tuple[unittest.TestCase, ErrorType]] = [] 24 self.failure_tables: t.List[t.Tuple[t.Any, ...]] = [] 25 self.original_errors: t.List[t.Tuple[unittest.TestCase, ErrorType]] = [] 26 self.duration: t.Optional[float] = None 27 28 def addSubTest( 29 self, 30 test: unittest.TestCase, 31 subtest: unittest.TestCase, 32 err: t.Optional[ErrorType], 33 ) -> None: 34 """Called at the end of a subtest. 35 36 The traceback is suppressed because it is redundant and not useful. 37 38 Args: 39 test: The test case. 40 subtest: The subtest instance. 41 err: A tuple of the form returned by sys.exc_info(), i.e., (type, value, traceback). 42 """ 43 if err: 44 exctype, value, tb = err 45 err = (exctype, value, None) # type: ignore 46 47 if err[0] and issubclass(err[0], test.failureException): 48 self.addFailure(test, err) 49 else: 50 self.addError(test, err) 51 52 def _print_char(self, char: str) -> None: 53 from sqlmesh.core.console import TerminalConsole 54 55 if isinstance(self.console, TerminalConsole): 56 self.console._print(char, end="") 57 58 def addFailure(self, test: unittest.TestCase, err: ErrorType) -> None: 59 """Called when the test case test signals a failure. 60 61 The traceback is suppressed because it is redundant and not useful. 62 63 Args: 64 test: The test case. 65 err: A tuple of the form returned by sys.exc_info(), i.e., (type, value, traceback). 66 """ 67 exctype, value, _ = err 68 69 if value and value.args: 70 exception_msg, rich_tables = value.args[:1], value.args[1:] 71 value.args = exception_msg 72 73 if rich_tables: 74 self.failure_tables.append(rich_tables) 75 76 self._print_char("F") 77 78 self.original_failures.append((test, err)) 79 80 # Intentionally ignore the traceback to hide it from the user 81 return super().addFailure(test, (exctype, value, None)) # type: ignore 82 83 def addError(self, test: unittest.TestCase, err: ErrorType) -> None: 84 """Called when the test case test signals an error. 85 86 Args: 87 test: The test case. 88 err: A tuple of the form returned by sys.exc_info(), i.e., (type, value, traceback). 89 """ 90 exctype, value, _ = err 91 self.original_errors.append((test, err)) 92 93 self._print_char("E") 94 95 # Intentionally ignore the traceback to hide it from the user 96 return super().addError(test, (exctype, value, None)) # type: ignore 97 98 def addSuccess(self, test: unittest.TestCase) -> None: 99 """Called when the test case test succeeds. 100 101 Args: 102 test: The test case 103 """ 104 super().addSuccess(test) 105 106 self._print_char(".") 107 108 self.successes.append(test) 109 110 def merge(self, other: ModelTextTestResult) -> None: 111 if other.successes: 112 self.addSuccess(other.successes[0]) 113 elif other.errors: 114 for error_test, error in other.original_errors: 115 self.addError(error_test, error) 116 elif other.failures: 117 for failure_test, failure in other.original_failures: 118 self.addFailure(failure_test, failure) 119 120 self.failure_tables.extend(other.failure_tables) 121 elif other.skipped: 122 skipped_args = other.skipped[0] 123 self.addSkip(skipped_args[0], skipped_args[1]) 124 125 self.testsRun += other.testsRun 126 127 def get_fail_and_error_tests(self) -> t.List[ModelTest]: 128 # If tests contain failed subtests (e.g testing CTE outputs) we don't want 129 # to report it as different test failures 130 test_name_to_test = { 131 test.test_name: test 132 for test, _ in self.failures + self.errors 133 if isinstance(test, ModelTest) 134 } 135 return list(test_name_to_test.values())
class
ModelTextTestResult(unittest.runner.TextTestResult):
17class ModelTextTestResult(unittest.TextTestResult): 18 successes: t.List[unittest.TestCase] 19 20 def __init__(self, *args: t.Any, **kwargs: t.Any): 21 self.console = kwargs.pop("console", None) 22 super().__init__(*args, **kwargs) 23 self.successes = [] 24 self.original_failures: t.List[t.Tuple[unittest.TestCase, ErrorType]] = [] 25 self.failure_tables: t.List[t.Tuple[t.Any, ...]] = [] 26 self.original_errors: t.List[t.Tuple[unittest.TestCase, ErrorType]] = [] 27 self.duration: t.Optional[float] = None 28 29 def addSubTest( 30 self, 31 test: unittest.TestCase, 32 subtest: unittest.TestCase, 33 err: t.Optional[ErrorType], 34 ) -> None: 35 """Called at the end of a subtest. 36 37 The traceback is suppressed because it is redundant and not useful. 38 39 Args: 40 test: The test case. 41 subtest: The subtest instance. 42 err: A tuple of the form returned by sys.exc_info(), i.e., (type, value, traceback). 43 """ 44 if err: 45 exctype, value, tb = err 46 err = (exctype, value, None) # type: ignore 47 48 if err[0] and issubclass(err[0], test.failureException): 49 self.addFailure(test, err) 50 else: 51 self.addError(test, err) 52 53 def _print_char(self, char: str) -> None: 54 from sqlmesh.core.console import TerminalConsole 55 56 if isinstance(self.console, TerminalConsole): 57 self.console._print(char, end="") 58 59 def addFailure(self, test: unittest.TestCase, err: ErrorType) -> None: 60 """Called when the test case test signals a failure. 61 62 The traceback is suppressed because it is redundant and not useful. 63 64 Args: 65 test: The test case. 66 err: A tuple of the form returned by sys.exc_info(), i.e., (type, value, traceback). 67 """ 68 exctype, value, _ = err 69 70 if value and value.args: 71 exception_msg, rich_tables = value.args[:1], value.args[1:] 72 value.args = exception_msg 73 74 if rich_tables: 75 self.failure_tables.append(rich_tables) 76 77 self._print_char("F") 78 79 self.original_failures.append((test, err)) 80 81 # Intentionally ignore the traceback to hide it from the user 82 return super().addFailure(test, (exctype, value, None)) # type: ignore 83 84 def addError(self, test: unittest.TestCase, err: ErrorType) -> None: 85 """Called when the test case test signals an error. 86 87 Args: 88 test: The test case. 89 err: A tuple of the form returned by sys.exc_info(), i.e., (type, value, traceback). 90 """ 91 exctype, value, _ = err 92 self.original_errors.append((test, err)) 93 94 self._print_char("E") 95 96 # Intentionally ignore the traceback to hide it from the user 97 return super().addError(test, (exctype, value, None)) # type: ignore 98 99 def addSuccess(self, test: unittest.TestCase) -> None: 100 """Called when the test case test succeeds. 101 102 Args: 103 test: The test case 104 """ 105 super().addSuccess(test) 106 107 self._print_char(".") 108 109 self.successes.append(test) 110 111 def merge(self, other: ModelTextTestResult) -> None: 112 if other.successes: 113 self.addSuccess(other.successes[0]) 114 elif other.errors: 115 for error_test, error in other.original_errors: 116 self.addError(error_test, error) 117 elif other.failures: 118 for failure_test, failure in other.original_failures: 119 self.addFailure(failure_test, failure) 120 121 self.failure_tables.extend(other.failure_tables) 122 elif other.skipped: 123 skipped_args = other.skipped[0] 124 self.addSkip(skipped_args[0], skipped_args[1]) 125 126 self.testsRun += other.testsRun 127 128 def get_fail_and_error_tests(self) -> t.List[ModelTest]: 129 # If tests contain failed subtests (e.g testing CTE outputs) we don't want 130 # to report it as different test failures 131 test_name_to_test = { 132 test.test_name: test 133 for test, _ in self.failures + self.errors 134 if isinstance(test, ModelTest) 135 } 136 return list(test_name_to_test.values())
A test result class that can print formatted text results to a stream.
Used by TextTestRunner.
ModelTextTestResult(*args: Any, **kwargs: Any)
20 def __init__(self, *args: t.Any, **kwargs: t.Any): 21 self.console = kwargs.pop("console", None) 22 super().__init__(*args, **kwargs) 23 self.successes = [] 24 self.original_failures: t.List[t.Tuple[unittest.TestCase, ErrorType]] = [] 25 self.failure_tables: t.List[t.Tuple[t.Any, ...]] = [] 26 self.original_errors: t.List[t.Tuple[unittest.TestCase, ErrorType]] = [] 27 self.duration: t.Optional[float] = None
original_failures: List[Tuple[unittest.case.TestCase, Union[Tuple[type[BaseException], BaseException, traceback], Tuple[NoneType, NoneType, NoneType]]]]
original_errors: List[Tuple[unittest.case.TestCase, Union[Tuple[type[BaseException], BaseException, traceback], Tuple[NoneType, NoneType, NoneType]]]]
def
addSubTest( self, test: unittest.case.TestCase, subtest: unittest.case.TestCase, err: Union[Tuple[type[BaseException], BaseException, traceback], Tuple[NoneType, NoneType, NoneType], NoneType]) -> None:
29 def addSubTest( 30 self, 31 test: unittest.TestCase, 32 subtest: unittest.TestCase, 33 err: t.Optional[ErrorType], 34 ) -> None: 35 """Called at the end of a subtest. 36 37 The traceback is suppressed because it is redundant and not useful. 38 39 Args: 40 test: The test case. 41 subtest: The subtest instance. 42 err: A tuple of the form returned by sys.exc_info(), i.e., (type, value, traceback). 43 """ 44 if err: 45 exctype, value, tb = err 46 err = (exctype, value, None) # type: ignore 47 48 if err[0] and issubclass(err[0], test.failureException): 49 self.addFailure(test, err) 50 else: 51 self.addError(test, err)
Called at the end of a subtest.
The traceback is suppressed because it is redundant and not useful.
Arguments:
- test: The test case.
- subtest: The subtest instance.
- err: A tuple of the form returned by sys.exc_info(), i.e., (type, value, traceback).
def
addFailure( self, test: unittest.case.TestCase, err: Union[Tuple[type[BaseException], BaseException, traceback], Tuple[NoneType, NoneType, NoneType]]) -> None:
59 def addFailure(self, test: unittest.TestCase, err: ErrorType) -> None: 60 """Called when the test case test signals a failure. 61 62 The traceback is suppressed because it is redundant and not useful. 63 64 Args: 65 test: The test case. 66 err: A tuple of the form returned by sys.exc_info(), i.e., (type, value, traceback). 67 """ 68 exctype, value, _ = err 69 70 if value and value.args: 71 exception_msg, rich_tables = value.args[:1], value.args[1:] 72 value.args = exception_msg 73 74 if rich_tables: 75 self.failure_tables.append(rich_tables) 76 77 self._print_char("F") 78 79 self.original_failures.append((test, err)) 80 81 # Intentionally ignore the traceback to hide it from the user 82 return super().addFailure(test, (exctype, value, None)) # type: ignore
Called when the test case test signals a failure.
The traceback is suppressed because it is redundant and not useful.
Arguments:
- test: The test case.
- err: A tuple of the form returned by sys.exc_info(), i.e., (type, value, traceback).
def
addError( self, test: unittest.case.TestCase, err: Union[Tuple[type[BaseException], BaseException, traceback], Tuple[NoneType, NoneType, NoneType]]) -> None:
84 def addError(self, test: unittest.TestCase, err: ErrorType) -> None: 85 """Called when the test case test signals an error. 86 87 Args: 88 test: The test case. 89 err: A tuple of the form returned by sys.exc_info(), i.e., (type, value, traceback). 90 """ 91 exctype, value, _ = err 92 self.original_errors.append((test, err)) 93 94 self._print_char("E") 95 96 # Intentionally ignore the traceback to hide it from the user 97 return super().addError(test, (exctype, value, None)) # type: ignore
Called when the test case test signals an error.
Arguments:
- test: The test case.
- err: A tuple of the form returned by sys.exc_info(), i.e., (type, value, traceback).
def
addSuccess(self, test: unittest.case.TestCase) -> None:
99 def addSuccess(self, test: unittest.TestCase) -> None: 100 """Called when the test case test succeeds. 101 102 Args: 103 test: The test case 104 """ 105 super().addSuccess(test) 106 107 self._print_char(".") 108 109 self.successes.append(test)
Called when the test case test succeeds.
Arguments:
- test: The test case
111 def merge(self, other: ModelTextTestResult) -> None: 112 if other.successes: 113 self.addSuccess(other.successes[0]) 114 elif other.errors: 115 for error_test, error in other.original_errors: 116 self.addError(error_test, error) 117 elif other.failures: 118 for failure_test, failure in other.original_failures: 119 self.addFailure(failure_test, failure) 120 121 self.failure_tables.extend(other.failure_tables) 122 elif other.skipped: 123 skipped_args = other.skipped[0] 124 self.addSkip(skipped_args[0], skipped_args[1]) 125 126 self.testsRun += other.testsRun
128 def get_fail_and_error_tests(self) -> t.List[ModelTest]: 129 # If tests contain failed subtests (e.g testing CTE outputs) we don't want 130 # to report it as different test failures 131 test_name_to_test = { 132 test.test_name: test 133 for test, _ in self.failures + self.errors 134 if isinstance(test, ModelTest) 135 } 136 return list(test_name_to_test.values())
Inherited Members
- unittest.runner.TextTestResult
- separator1
- separator2
- stream
- showAll
- dots
- descriptions
- getDescription
- startTest
- addSkip
- addExpectedFailure
- addUnexpectedSuccess
- printErrors
- printErrorList
- unittest.result.TestResult
- failfast
- failures
- errors
- testsRun
- skipped
- expectedFailures
- unexpectedSuccesses
- shouldStop
- buffer
- tb_locals
- startTestRun
- stopTest
- stopTestRun
- wasSuccessful
- stop