Fixes #16632: Add testCases property to a test suite source config (#16631)

* feat: test-suites

enable specifying a subset of test cases to run in a test suite pipeline

* improved property description
This commit is contained in:
Imri Paran 2024-06-19 12:47:38 +02:00 committed by GitHub
parent 5c2f01cd41
commit c79c5da00a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 109 additions and 2 deletions

View File

@ -89,7 +89,10 @@ class TestSuiteSource(Source):
params={"testSuiteId": test_suite.id.root}, params={"testSuiteId": test_suite.id.root},
) )
test_cases = cast(List[TestCase], test_cases) # satisfy type checker test_cases = cast(List[TestCase], test_cases) # satisfy type checker
if self.source_config.testCases is not None:
test_cases = [
t for t in test_cases if t.name in self.source_config.testCases
]
return test_cases return test_cases
return None return None

View File

@ -0,0 +1,96 @@
from unittest.mock import Mock
from uuid import UUID
import pytest
from metadata.data_quality.source.test_suite import TestSuiteSource
from metadata.generated.schema.entity.data.table import Table
from metadata.generated.schema.metadataIngestion.workflow import (
OpenMetadataWorkflowConfig,
)
from metadata.generated.schema.tests.testCase import TestCase
from metadata.generated.schema.tests.testSuite import TestSuite
from metadata.generated.schema.type.entityReference import EntityReference
from metadata.ingestion.ometa.ometa_api import OpenMetadata
MOCK_ENTITY_REFERENCE = EntityReference(
id=str(UUID(int=0)), type="test_suite", name="test_suite"
)
@pytest.mark.parametrize(
"parameters,expected",
[
(
{
"type": "TestSuite",
"entityFullyQualifiedName": "MyTestSuite",
},
["test_case1", "test_case2"],
),
(
{
"type": "TestSuite",
"entityFullyQualifiedName": "MyTestSuite",
"testCases": [
"test_case1",
],
},
["test_case1"],
),
],
)
def test_source_config(parameters, expected, monkeypatch):
workflow_config = {
"source": {
"type": "TestSuite",
"serviceName": "MyTestSuite",
"sourceConfig": {"config": parameters},
"serviceConnection": {
"config": {
"type": "Mysql",
"hostPort": "localhost:3306",
"username": "root",
}
},
},
"workflowConfig": {
"openMetadataServerConfig": {
"hostPort": "localhost:8585",
}
},
}
monkeypatch.setattr(TestSuiteSource, "test_connection", Mock())
mock_metadata = Mock(spec=OpenMetadata)
mock_metadata.get_by_name.return_value = Table(
id=UUID(int=0),
name="test_table",
columns=[],
testSuite=MOCK_ENTITY_REFERENCE,
)
mock_metadata.list_all_entities.return_value = [
TestCase(
name="test_case1",
id=UUID(int=0),
testDefinition=MOCK_ENTITY_REFERENCE,
testSuite=MOCK_ENTITY_REFERENCE,
entityLink="<#E::some::link>",
),
TestCase(
name="test_case2",
id=UUID(int=0),
testDefinition=MOCK_ENTITY_REFERENCE,
testSuite=MOCK_ENTITY_REFERENCE,
entityLink="<#E::some::link>",
),
]
mock_metadata.get_by_id.return_value = TestSuite(
name="test_suite", executable=True, id=UUID(int=0)
)
source = TestSuiteSource(
OpenMetadataWorkflowConfig.parse_obj(workflow_config), mock_metadata
)
test_cases = list(source._iter())[0].right.test_cases
assert [t.name.root for t in test_cases] == expected

View File

@ -78,6 +78,7 @@ source:
config: config:
type: TestSuite type: TestSuite
entityFullyQualifiedName: MySQL.default.openmetadata_db.tag_usage entityFullyQualifiedName: MySQL.default.openmetadata_db.tag_usage
# testCases: ["run_only_this_test_case"] # Optional, if not provided all tests will be executed
processor: processor:
type: "orm-test-runner" type: "orm-test-runner"

View File

@ -31,7 +31,14 @@
"profileSampleType": { "profileSampleType": {
"$ref": "../entity/data/table.json#/definitions/profileSampleType", "$ref": "../entity/data/table.json#/definitions/profileSampleType",
"title": "Profile Sample Type" "title": "Profile Sample Type"
},
"testCases": {
"description": "List of test cases to be executed on the entity. If null, all test cases will be executed.",
"type": "array",
"items": {
"$ref": "../type/basic.json#/definitions/testCaseEntityName"
},
"default": null
} }
}, },
"required": ["type", "entityFullyQualifiedName"], "required": ["type", "entityFullyQualifiedName"],