Files
ray-project--ray/ci/ray_ci/automation/test_determine_microcheck_tests.py
2026-07-13 13:17:40 +08:00

230 lines
6.7 KiB
Python

import json
import sys
from typing import List
import pytest
from ci.ray_ci.automation.determine_microcheck_tests import (
_get_failed_commits,
_get_failed_tests_from_master_branch,
_get_flaky_tests,
_get_test_with_minimal_coverage,
_update_high_impact_tests,
)
from ci.ray_ci.utils import ci_init
from ray_release.result import ResultStatus
from ray_release.test import Test, TestResult
ci_init()
DB = {}
class MockTest(dict):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
def get_name(self) -> str:
return self.get("name", "")
def get_test_results(
self, limit: int, aws_bucket: str, use_async: bool, refresh: bool
) -> List[TestResult]:
return self.get("test_results", [])
def update_from_s3(self) -> None:
pass
def persist_to_s3(self) -> None:
DB[self["name"]] = json.dumps(self)
def stub_test_result(status: ResultStatus, branch: str, commit: str = "") -> TestResult:
return TestResult(
status=status.value,
branch=branch,
commit=commit,
url="",
timestamp=0,
pull_request="",
rayci_step_id="",
)
def test_update_high_impact_tests():
tests = [
MockTest(
{
"name": "good_test",
Test.KEY_IS_HIGH_IMPACT: "false",
}
),
MockTest(
{
"name": "bad_test",
Test.KEY_IS_HIGH_IMPACT: "false",
}
),
]
_update_high_impact_tests(tests, {"good_test"})
assert json.loads(DB["good_test"])[Test.KEY_IS_HIGH_IMPACT] == "true"
assert json.loads(DB["bad_test"])[Test.KEY_IS_HIGH_IMPACT] == "false"
def test_get_failed_commits():
assert _get_failed_commits(
MockTest(
{
"name": "test",
"test_results": [
stub_test_result(ResultStatus.ERROR, "w00t", commit="1w00t2"),
stub_test_result(ResultStatus.ERROR, "w00t", commit="2w00t3"),
stub_test_result(ResultStatus.SUCCESS, "hi", commit="5hi7"),
stub_test_result(ResultStatus.ERROR, "f00", commit="1f003"),
],
}
),
1,
) == {"1w00t2", "2w00t3", "1f003"}
def test_get_failed_tests_from_master_branch():
failed_test_01 = MockTest(
{
"name": "test_01",
"test_results": [
stub_test_result(ResultStatus.ERROR, "master"),
stub_test_result(ResultStatus.SUCCESS, "master"),
stub_test_result(ResultStatus.ERROR, "master"),
stub_test_result(ResultStatus.ERROR, "master"),
],
},
)
failed_test_02 = MockTest(
{
"name": "test_02",
"test_results": [
stub_test_result(ResultStatus.ERROR, "non_master"),
stub_test_result(ResultStatus.SUCCESS, "non_master"),
stub_test_result(ResultStatus.ERROR, "non_master"),
stub_test_result(ResultStatus.ERROR, "non_master"),
],
},
)
failed_test_03 = MockTest(
{
"name": "test_03",
"test_results": [
stub_test_result(ResultStatus.ERROR, "master"),
stub_test_result(ResultStatus.SUCCESS, "master"),
stub_test_result(ResultStatus.ERROR, "master"),
],
},
)
_get_failed_tests_from_master_branch(
[failed_test_01, failed_test_02, failed_test_03], 2
) == {"test_01"}
def test_get_flaky_tests():
good_test = MockTest(
{
"name": "good_test",
"test_results": [
stub_test_result(ResultStatus.SUCCESS, "master"),
stub_test_result(ResultStatus.SUCCESS, "master"),
stub_test_result(ResultStatus.SUCCESS, "master"),
],
},
)
flaky_test = MockTest(
{
"name": "flaky_test",
"test_results": [
stub_test_result(ResultStatus.SUCCESS, "master"),
stub_test_result(ResultStatus.ERROR, "master"),
stub_test_result(ResultStatus.SUCCESS, "master"),
stub_test_result(ResultStatus.ERROR, "master"),
stub_test_result(ResultStatus.SUCCESS, "master"),
stub_test_result(ResultStatus.ERROR, "master"),
stub_test_result(ResultStatus.SUCCESS, "master"),
],
},
)
bad_test = MockTest(
{
"name": "flaky_test",
"test_results": [
stub_test_result(ResultStatus.SUCCESS, "master"),
stub_test_result(ResultStatus.ERROR, "master"),
stub_test_result(ResultStatus.ERROR, "master"),
stub_test_result(ResultStatus.ERROR, "master"),
stub_test_result(ResultStatus.SUCCESS, "master"),
stub_test_result(ResultStatus.SUCCESS, "master"),
stub_test_result(ResultStatus.SUCCESS, "master"),
],
},
)
assert _get_flaky_tests([good_test, flaky_test, bad_test], 2) == {"flaky_test"}
def test_get_test_with_minimal_coverage():
# empty cases
assert _get_test_with_minimal_coverage({}, {}, 50) == set()
# normal cases
test_to_prs = {
"test1": {"a"},
"test2": {"a", "b"},
"test3": {"c"},
"test4": {"d"},
}
assert _get_test_with_minimal_coverage(test_to_prs, {"test2"}, 0) == set()
assert _get_test_with_minimal_coverage(test_to_prs, {"test2"}, 50) == {
"test1",
"test3",
}
assert _get_test_with_minimal_coverage(test_to_prs, {"test2"}, 75) == {
"test1",
"test3",
"test4",
}
# one beat all cases
test_to_prs = {
"test1": {"a"},
"test2": {"a", "b"},
"test3": {"a", "b", "c"},
}
assert _get_test_with_minimal_coverage(test_to_prs, {}, 50) == {"test3"}
assert _get_test_with_minimal_coverage(test_to_prs, {}, 75) == {"test3"}
# equal distribution cases
test_to_prs = {
"test1": {"a"},
"test2": {"b"},
"test3": {"c"},
}
assert _get_test_with_minimal_coverage(test_to_prs, {}, 100) == {
"test1",
"test2",
"test3",
}
# one beat all but flaky test cases
test_to_prs = {
"test1": {"a"},
"test2": {"a", "b"},
"test3": {"a", "b", "c"},
}
assert _get_test_with_minimal_coverage(test_to_prs, {"test3"}, 50) == {"test2"}
assert _get_test_with_minimal_coverage(test_to_prs, {"test3"}, 75) == {
"test2",
"test3",
}
if __name__ == "__main__":
sys.exit(pytest.main(["-v", __file__]))