- 从stdin传入测试数据
- 动态加载实现函数
- 运行函数
- 检查输出是否正确
import copy
import os
import shutil
import sys
from traceback import extract_tb
import traceback
from types import TracebackType
from typing import Any, Callable, List, Optional, Tuple
# import color
# from color import format_color, use_color
def run_testcases(
method: Callable[..., Any],
tests: List[Tuple[Any, Any]],
validator: Any,
) -> Tuple[List[Tuple[TracebackType, Any, Any, Any]], int]:
"""Run given test cases, and collect all failing assertions"""
failed_testcases: List[Tuple[TracebackType, Any, Any, Any]] = []
errored_count = 0
for index, (inputs, expected) in enumerate(tests, start=1):
try:
validator(method, copy.deepcopy(inputs), expected)
result = 'PASSED'
except KeyboardInterrupt:
break
except Exception as exc:
result = 'FAILED'
if type(exc) != AssertionError:
traceback.print_exc()
errored_count += 1
continue
*_, trace = sys.exc_info()
assert trace is not None
if len(exc.args) != 1:
raise ValueError(
"No assertion value provided in custom validator"
) from exc
(assertion_values,) = exc.args
if len(assertion_values) != 2:
raise ValueError(
"Assertion value must be provided as (output, expected)"
) from exc
output, expected = assertion_values
failed_testcases.append((trace, inputs, expected, output))
finally:
test_case = f"Test {index} - ({', '.join(map(str, inputs))})"
print(test_case, result)
# print_test_result(test_case, result, result_color)
return failed_testcases, errored_count
# 检测结果
def default_validator(
method: Callable[..., Any],
inputs: Tuple[Any, ...],
expected: Tuple[Any, ...],
) -> None:
"""Default validator for leetcode tests"""
output = method(*inputs)
assert output == expected, (output, expected)
module = __import__('temperature')
solution_class = getattr(module, 'Solution')
method_names = [name for name in dir(
solution_class) if not name.startswith('_')]
(method_name,) = method_names
method = getattr(solution_class(), method_name)
tests = getattr(module, 'tests')
validator = default_validator
failed_testcases, errored_count = run_testcases(method, tests, validator)
相关参考资料:
https://github.com/hjue/python_leetcode_runner
https://dev.to/tusharsadhwani/ace-your-leetcode-preparations-40l