mirror of
https://github.com/open-metadata/OpenMetadata.git
synced 2025-11-03 12:08:31 +00:00
This commit is contained in:
parent
8fac9d8976
commit
6e92dc6938
@ -2912,7 +2912,7 @@ public interface CollectionDAO {
|
||||
|
||||
@SqlQuery(
|
||||
"SELECT ranked.json FROM (SELECT json, ROW_NUMBER() OVER(PARTITION BY entityFQNHash ORDER BY timestamp DESC) AS row_num "
|
||||
+ "FROM entity_extension_time_series WHERE entityFQNHash IN (<entityFQNHashes>)) ranked WHERE ranked.row_num = 1")
|
||||
+ "FROM entity_extension_time_series WHERE entityFQNHash IN (<entityFQNHashes>) AND extension = :extension) ranked WHERE ranked.row_num = 1")
|
||||
List<String> getLatestExtensionByFQNs(
|
||||
@BindList("entityFQNHashes") List<String> entityFQNHashes, @Bind("extension") String extension);
|
||||
|
||||
|
||||
@ -26,7 +26,6 @@ import org.openmetadata.schema.tests.TestCaseParameterValue;
|
||||
import org.openmetadata.schema.tests.TestDefinition;
|
||||
import org.openmetadata.schema.tests.TestSuite;
|
||||
import org.openmetadata.schema.tests.type.TestCaseResult;
|
||||
import org.openmetadata.schema.tests.type.TestCaseStatus;
|
||||
import org.openmetadata.schema.tests.type.TestSummary;
|
||||
import org.openmetadata.schema.type.ChangeDescription;
|
||||
import org.openmetadata.schema.type.ChangeEvent;
|
||||
@ -306,32 +305,21 @@ public class TestCaseRepository extends EntityRepository<TestCase> {
|
||||
return new RestUtil.DeleteResponse<>(testCase, RestUtil.ENTITY_DELETED);
|
||||
}
|
||||
|
||||
public TestSummary getTestSummary() throws IOException {
|
||||
List<TestCase> testCases = listAll(Fields.EMPTY_FIELDS, new ListFilter());
|
||||
List<String> testCaseFQNHashes =
|
||||
testCases.stream()
|
||||
.map(testCase -> FullyQualifiedName.buildHash(testCase.getFullyQualifiedName()))
|
||||
.collect(Collectors.toList());
|
||||
|
||||
if (testCaseFQNHashes.isEmpty()) return new TestSummary();
|
||||
|
||||
List<String> jsonList =
|
||||
daoCollection
|
||||
.entityExtensionTimeSeriesDao()
|
||||
.getLatestExtensionByFQNs(testCaseFQNHashes, TESTCASE_RESULT_EXTENSION);
|
||||
|
||||
HashMap<String, Integer> testCaseSummary = new HashMap<>();
|
||||
for (String json : jsonList) {
|
||||
TestCaseResult testCaseResult = JsonUtils.readValue(json, TestCaseResult.class);
|
||||
String status = testCaseResult.getTestCaseStatus().toString();
|
||||
testCaseSummary.put(status, testCaseSummary.getOrDefault(status, 0) + 1);
|
||||
public TestSummary getTestSummary(UUID testSuiteId) throws IOException {
|
||||
List<String> testCaseFQNs;
|
||||
if (testSuiteId == null) {
|
||||
List<TestCase> testCases = listAll(Fields.EMPTY_FIELDS, new ListFilter());
|
||||
testCaseFQNs = testCases.stream().map(TestCase::getFullyQualifiedName).collect(Collectors.toList());
|
||||
} else {
|
||||
List<CollectionDAO.EntityRelationshipRecord> testCases =
|
||||
findTo(testSuiteId, TEST_SUITE, Relationship.CONTAINS, TEST_CASE);
|
||||
List<EntityReference> testCasesEntityReferences = EntityUtil.getEntityReferences(testCases);
|
||||
testCaseFQNs =
|
||||
testCasesEntityReferences.stream().map(EntityReference::getFullyQualifiedName).collect(Collectors.toList());
|
||||
}
|
||||
|
||||
return new TestSummary()
|
||||
.withAborted(testCaseSummary.getOrDefault(TestCaseStatus.Aborted.toString(), 0))
|
||||
.withFailed(testCaseSummary.getOrDefault(TestCaseStatus.Failed.toString(), 0))
|
||||
.withSuccess(testCaseSummary.getOrDefault(TestCaseStatus.Success.toString(), 0))
|
||||
.withTotal(testCaseFQNHashes.size());
|
||||
return EntityUtil.getTestCaseExecutionSummary(
|
||||
daoCollection.entityExtensionTimeSeriesDao(), testCaseFQNs, TESTCASE_RESULT_EXTENSION);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@ -6,15 +6,12 @@ import static org.openmetadata.service.Entity.TEST_SUITE;
|
||||
import static org.openmetadata.service.jdbi3.TestCaseRepository.TESTCASE_RESULT_EXTENSION;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
import javax.ws.rs.core.SecurityContext;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.openmetadata.schema.entity.data.Table;
|
||||
import org.openmetadata.schema.tests.TestSuite;
|
||||
import org.openmetadata.schema.tests.type.TestCaseResult;
|
||||
import org.openmetadata.schema.tests.type.TestCaseStatus;
|
||||
import org.openmetadata.schema.tests.type.TestSummary;
|
||||
import org.openmetadata.schema.type.EntityReference;
|
||||
import org.openmetadata.schema.type.Relationship;
|
||||
@ -49,25 +46,11 @@ public class TestSuiteRepository extends EntityRepository<TestSuite> {
|
||||
|
||||
private TestSummary getTestSummary(TestSuite entity) throws IOException {
|
||||
List<EntityReference> testCases = getTestCases(entity);
|
||||
HashMap<String, Integer> testCaseSummary = new HashMap<>();
|
||||
List<String> testCaseFQNs =
|
||||
testCases.stream().map(EntityReference::getFullyQualifiedName).collect(Collectors.toList());
|
||||
|
||||
if (testCaseFQNs.isEmpty()) return new TestSummary();
|
||||
|
||||
List<String> jsonList =
|
||||
daoCollection.entityExtensionTimeSeriesDao().getLatestExtensionByFQNs(testCaseFQNs, TESTCASE_RESULT_EXTENSION);
|
||||
|
||||
for (String json : jsonList) {
|
||||
TestCaseResult testCaseResult = JsonUtils.readValue(json, TestCaseResult.class);
|
||||
String status = testCaseResult.getTestCaseStatus().toString();
|
||||
testCaseSummary.put(status, testCaseSummary.getOrDefault(status, 0) + 1);
|
||||
}
|
||||
return new TestSummary()
|
||||
.withAborted(testCaseSummary.getOrDefault(TestCaseStatus.Aborted.toString(), 0))
|
||||
.withFailed(testCaseSummary.getOrDefault(TestCaseStatus.Failed.toString(), 0))
|
||||
.withSuccess(testCaseSummary.getOrDefault(TestCaseStatus.Success.toString(), 0))
|
||||
.withTotal(testCaseFQNs.size());
|
||||
return EntityUtil.getTestCaseExecutionSummary(
|
||||
daoCollection.entityExtensionTimeSeriesDao(), testCaseFQNs, TESTCASE_RESULT_EXTENSION);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@ -708,12 +708,19 @@ public class TestCaseResource extends EntityResource<TestCase, TestCaseRepositor
|
||||
description = "Tests Execution Summary",
|
||||
content = @Content(mediaType = "application/json", schema = @Schema(implementation = TestSummary.class)))
|
||||
})
|
||||
public TestSummary getTestsExecutionSummary(@Context UriInfo uriInfo, @Context SecurityContext securityContext)
|
||||
public TestSummary getTestsExecutionSummary(
|
||||
@Context UriInfo uriInfo,
|
||||
@Context SecurityContext securityContext,
|
||||
@Parameter(
|
||||
description = "get summary for a specific test suite",
|
||||
schema = @Schema(type = "String", format = "uuid"))
|
||||
@QueryParam("testSuiteId")
|
||||
UUID testSuiteId)
|
||||
throws IOException {
|
||||
ResourceContextInterface resourceContext = TestCaseResourceContext.builder().build();
|
||||
OperationContext operationContext = new OperationContext(Entity.TABLE, MetadataOperation.VIEW_TESTS);
|
||||
authorizer.authorize(securityContext, operationContext, resourceContext);
|
||||
return repository.getTestSummary();
|
||||
return repository.getTestSummary(testSuiteId);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@ -23,10 +23,12 @@ import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.Comparator;
|
||||
import java.util.Date;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
import java.util.function.BiPredicate;
|
||||
import java.util.regex.Pattern;
|
||||
import java.util.stream.Collectors;
|
||||
import javax.ws.rs.WebApplicationException;
|
||||
import lombok.Getter;
|
||||
import lombok.NonNull;
|
||||
@ -44,11 +46,15 @@ import org.openmetadata.schema.entity.data.Topic;
|
||||
import org.openmetadata.schema.entity.policies.accessControl.Rule;
|
||||
import org.openmetadata.schema.entity.type.CustomProperty;
|
||||
import org.openmetadata.schema.system.FailureDetails;
|
||||
import org.openmetadata.schema.tests.type.TestCaseResult;
|
||||
import org.openmetadata.schema.tests.type.TestCaseStatus;
|
||||
import org.openmetadata.schema.tests.type.TestSummary;
|
||||
import org.openmetadata.schema.type.*;
|
||||
import org.openmetadata.schema.type.TagLabel.TagSource;
|
||||
import org.openmetadata.service.Entity;
|
||||
import org.openmetadata.service.exception.CatalogExceptionMessage;
|
||||
import org.openmetadata.service.exception.EntityNotFoundException;
|
||||
import org.openmetadata.service.jdbi3.CollectionDAO;
|
||||
import org.openmetadata.service.jdbi3.CollectionDAO.EntityRelationshipRecord;
|
||||
import org.openmetadata.service.jdbi3.CollectionDAO.EntityVersionPair;
|
||||
import org.openmetadata.service.jdbi3.CollectionDAO.UsageDAO;
|
||||
@ -205,6 +211,32 @@ public final class EntityUtil {
|
||||
return details;
|
||||
}
|
||||
|
||||
public static TestSummary getTestCaseExecutionSummary(
|
||||
CollectionDAO.EntityExtensionTimeSeriesDAO entityExtensionTimeSeriesDAO,
|
||||
List<String> testCaseFQNs,
|
||||
String extensionName)
|
||||
throws IOException {
|
||||
List<String> testCaseFQNHashes =
|
||||
testCaseFQNs.stream().map(fqn -> FullyQualifiedName.buildHash(fqn)).collect(Collectors.toList());
|
||||
|
||||
if (testCaseFQNHashes.isEmpty()) return new TestSummary();
|
||||
|
||||
List<String> jsonList = entityExtensionTimeSeriesDAO.getLatestExtensionByFQNs(testCaseFQNHashes, extensionName);
|
||||
|
||||
HashMap<String, Integer> testCaseSummary = new HashMap<>();
|
||||
for (String json : jsonList) {
|
||||
TestCaseResult testCaseResult = JsonUtils.readValue(json, TestCaseResult.class);
|
||||
String status = testCaseResult.getTestCaseStatus().toString();
|
||||
testCaseSummary.put(status, testCaseSummary.getOrDefault(status, 0) + 1);
|
||||
}
|
||||
|
||||
return new TestSummary()
|
||||
.withAborted(testCaseSummary.getOrDefault(TestCaseStatus.Aborted.toString(), 0))
|
||||
.withFailed(testCaseSummary.getOrDefault(TestCaseStatus.Failed.toString(), 0))
|
||||
.withSuccess(testCaseSummary.getOrDefault(TestCaseStatus.Success.toString(), 0))
|
||||
.withTotal(jsonList.size());
|
||||
}
|
||||
|
||||
/** Merge two sets of tags */
|
||||
public static void mergeTags(List<TagLabel> mergeTo, List<TagLabel> mergeFrom) {
|
||||
if (nullOrEmpty(mergeFrom)) {
|
||||
|
||||
@ -6,6 +6,7 @@ import static javax.ws.rs.core.Response.Status.FORBIDDEN;
|
||||
import static javax.ws.rs.core.Response.Status.NOT_FOUND;
|
||||
import static javax.ws.rs.core.Response.Status.OK;
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertNotEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
||||
import static org.junit.jupiter.api.Assertions.assertNull;
|
||||
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||
@ -337,10 +338,14 @@ public class TestCaseResourceTest extends EntityResourceTest<TestCase, CreateTes
|
||||
ADMIN_AUTH_HEADERS);
|
||||
verifyTestCaseResults(testCaseResults, testCase1ResultList, 4);
|
||||
|
||||
TestSummary testSummary = getTestSummary(ADMIN_AUTH_HEADERS);
|
||||
assertEquals(2, testSummary.getFailed());
|
||||
assertEquals(2, testSummary.getSuccess());
|
||||
TestSummary testSummary = getTestSummary(ADMIN_AUTH_HEADERS, null);
|
||||
assertNotEquals(0, testSummary.getFailed());
|
||||
assertNotEquals(0, testSummary.getSuccess());
|
||||
assertNotEquals(0, testSummary.getTotal());
|
||||
assertEquals(0, testSummary.getAborted());
|
||||
|
||||
TestSummary emptyTestSummary = getTestSummary(ADMIN_AUTH_HEADERS, UUID.randomUUID().toString());
|
||||
assertNull(emptyTestSummary.getFailed());
|
||||
}
|
||||
|
||||
@Test
|
||||
@ -692,8 +697,11 @@ public class TestCaseResourceTest extends EntityResourceTest<TestCase, CreateTes
|
||||
return TestUtils.get(target, TestCaseResource.TestCaseResultList.class, authHeaders);
|
||||
}
|
||||
|
||||
private TestSummary getTestSummary(Map<String, String> authHeaders) throws IOException {
|
||||
private TestSummary getTestSummary(Map<String, String> authHeaders, String testSuiteId) throws IOException {
|
||||
WebTarget target = getCollection().path("/executionSummary");
|
||||
if (testSuiteId != null) {
|
||||
target = target.queryParam("testSuiteId", testSuiteId);
|
||||
}
|
||||
return TestUtils.get(target, TestSummary.class, authHeaders);
|
||||
}
|
||||
|
||||
|
||||
@ -3,7 +3,7 @@ package org.openmetadata.service.resources.dqtests;
|
||||
import static javax.ws.rs.core.Response.Status.BAD_REQUEST;
|
||||
import static javax.ws.rs.core.Response.Status.NOT_FOUND;
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
||||
import static org.junit.jupiter.api.Assertions.assertNotEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertNull;
|
||||
import static org.openmetadata.service.util.TestUtils.ADMIN_AUTH_HEADERS;
|
||||
import static org.openmetadata.service.util.TestUtils.LONG_ENTITY_NAME;
|
||||
@ -13,6 +13,7 @@ import static org.openmetadata.service.util.TestUtils.assertResponse;
|
||||
import static org.openmetadata.service.util.TestUtils.assertResponseContains;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.text.ParseException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
@ -31,6 +32,8 @@ import org.openmetadata.schema.api.tests.CreateTestSuite;
|
||||
import org.openmetadata.schema.entity.data.Table;
|
||||
import org.openmetadata.schema.tests.TestCase;
|
||||
import org.openmetadata.schema.tests.TestSuite;
|
||||
import org.openmetadata.schema.tests.type.TestCaseResult;
|
||||
import org.openmetadata.schema.tests.type.TestCaseStatus;
|
||||
import org.openmetadata.schema.type.Column;
|
||||
import org.openmetadata.schema.type.ColumnDataType;
|
||||
import org.openmetadata.schema.type.EntityReference;
|
||||
@ -104,15 +107,21 @@ public class TestSuiteResourceTest extends EntityResourceTest<TestSuite, CreateT
|
||||
}
|
||||
|
||||
@Test
|
||||
void put_testCaseResults_200() throws IOException {
|
||||
void put_testCaseResults_200() throws IOException, ParseException {
|
||||
TestCaseResourceTest testCaseResourceTest = new TestCaseResourceTest();
|
||||
List<EntityReference> testCases1 = new ArrayList<>();
|
||||
TestCaseResult testCaseResult =
|
||||
new TestCaseResult()
|
||||
.withResult("tested")
|
||||
.withTestCaseStatus(TestCaseStatus.Success)
|
||||
.withTimestamp(TestUtils.dateToTimestamp("2021-09-09"));
|
||||
|
||||
for (int i = 0; i < 5; i++) {
|
||||
CreateTestCase createTestCase =
|
||||
testCaseResourceTest.createRequest("test_testSuite_" + i).withTestSuite(TEST_SUITE1.getFullyQualifiedName());
|
||||
TestCase testCase = testCaseResourceTest.createAndCheckEntity(createTestCase, ADMIN_AUTH_HEADERS);
|
||||
testCases1.add(testCase.getEntityReference());
|
||||
testCaseResourceTest.putTestCaseResult(testCase.getFullyQualifiedName(), testCaseResult, ADMIN_AUTH_HEADERS);
|
||||
}
|
||||
|
||||
for (int i = 5; i < 10; i++) {
|
||||
@ -120,7 +129,8 @@ public class TestSuiteResourceTest extends EntityResourceTest<TestSuite, CreateT
|
||||
testCaseResourceTest
|
||||
.createRequest("test_testSuite_2_" + i)
|
||||
.withTestSuite(TEST_SUITE2.getFullyQualifiedName());
|
||||
testCaseResourceTest.createAndCheckEntity(create, ADMIN_AUTH_HEADERS);
|
||||
TestCase testCase = testCaseResourceTest.createAndCheckEntity(create, ADMIN_AUTH_HEADERS);
|
||||
testCaseResourceTest.putTestCaseResult(testCase.getFullyQualifiedName(), testCaseResult, ADMIN_AUTH_HEADERS);
|
||||
}
|
||||
|
||||
ResultList<TestSuite> actualTestSuites = getTestSuites(10, "*", ADMIN_AUTH_HEADERS);
|
||||
@ -446,7 +456,8 @@ public class TestSuiteResourceTest extends EntityResourceTest<TestSuite, CreateT
|
||||
TestSuite storedTestSuite = testSuiteMap.get(result.getName());
|
||||
if (storedTestSuite == null) continue;
|
||||
validateCreatedEntity(storedTestSuite, result, ADMIN_AUTH_HEADERS);
|
||||
assertNotNull(storedTestSuite.getSummary());
|
||||
assertNotEquals(0, storedTestSuite.getSummary().getSuccess());
|
||||
assertNotEquals(0, storedTestSuite.getSummary().getTotal());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user