From c21c62454ad8bb3a4ebd58c841b993f090a1b590 Mon Sep 17 00:00:00 2001 From: Roman Burlaka Date: Wed, 22 Oct 2025 20:49:28 +0200 Subject: [PATCH 1/4] influxReader added --- src/test/java/ui/testing/utils/InfluxReader.java | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 src/test/java/ui/testing/utils/InfluxReader.java diff --git a/src/test/java/ui/testing/utils/InfluxReader.java b/src/test/java/ui/testing/utils/InfluxReader.java new file mode 100644 index 0000000..17918ae --- /dev/null +++ b/src/test/java/ui/testing/utils/InfluxReader.java @@ -0,0 +1,4 @@ +package ui.testing.utils; + +public class InfluxReader { +} From 65d842f66506ff3c23a035a12d91753a6a0d7ce2 Mon Sep 17 00:00:00 2001 From: Roman Burlaka Date: Wed, 22 Oct 2025 21:12:08 +0200 Subject: [PATCH 2/4] added ci influx --- .github/workflows/ci.yml | 18 +++++++- pom.xml | 6 +++ src/test/java/ui/testing/base/BaseTest.java | 4 ++ .../java/ui/testing/utils/InfluxReader.java | 44 +++++++++++++++++++ 4 files changed, 71 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 903672f..796dcb6 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -31,7 +31,10 @@ jobs: run: mvn -B -e clean test -Dselenium.headless=true || true env: CHROME_OPTIONS: --remote-allow-origins=*;--disable-gpu;--no-sandbox;--disable-dev-shm-usage;--headless=new;--window-size=1920,1080 - + INFLUX_URL: ${{ secrets.INFLUX_URL }} + INFLUX_TOKEN: ${{ secrets.INFLUX_TOKEN }} + INFLUX_ORG: ${{ secrets.INFLUX_ORG }} + INFLUX_BUCKET: ${{ secrets.INFLUX_BUCKET }} # 4. Output failed tests - name: Print failed tests if: failure() @@ -94,3 +97,16 @@ jobs: with: name: allure-report path: allure-report + + # 11 Print all metrics + - name: Print test metrics summary + if: always() + run: | + mvn -q exec:java -Dexec.mainClass=utils.InfluxReader > influx-summary.txt + echo "### Test metrics from InfluxDB" >> $GITHUB_STEP_SUMMARY + cat influx-summary.txt >> $GITHUB_STEP_SUMMARY + env: + INFLUX_URL: ${{ secrets.INFLUX_URL }} + INFLUX_TOKEN: ${{ secrets.INFLUX_TOKEN }} + INFLUX_ORG: ${{ secrets.INFLUX_ORG }} + INFLUX_BUCKET: ${{ secrets.INFLUX_BUCKET }} \ No newline at end of file diff --git a/pom.xml b/pom.xml index 9002ade..e9b0a3a 100644 --- a/pom.xml +++ b/pom.xml @@ -84,6 +84,12 @@ selenide 7.8.0 + + + com.influxdb + influxdb-client-java + 6.11.0 + diff --git a/src/test/java/ui/testing/base/BaseTest.java b/src/test/java/ui/testing/base/BaseTest.java index 2423099..6780c8f 100644 --- a/src/test/java/ui/testing/base/BaseTest.java +++ b/src/test/java/ui/testing/base/BaseTest.java @@ -7,6 +7,7 @@ import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; import org.testng.asserts.SoftAssert; +import ui.testing.utils.InfluxReader; public class BaseTest { protected WebDriver driver; @@ -36,8 +37,11 @@ public void setUp() { @AfterMethod(alwaysRun = true) public void tearDown() { + InfluxReader.printAllureMetrics(); if (driver != null) { driver.quit(); } } + } + diff --git a/src/test/java/ui/testing/utils/InfluxReader.java b/src/test/java/ui/testing/utils/InfluxReader.java index 17918ae..4aca966 100644 --- a/src/test/java/ui/testing/utils/InfluxReader.java +++ b/src/test/java/ui/testing/utils/InfluxReader.java @@ -1,4 +1,48 @@ package ui.testing.utils; +import com.influxdb.client.InfluxDBClient; +import com.influxdb.client.InfluxDBClientFactory; +import com.influxdb.query.FluxTable; + +import java.util.List; + public class InfluxReader { + + public static void printAllureMetrics() { + String url = System.getenv("INFLUX_URL"); + String token = System.getenv("INFLUX_TOKEN"); + String org = System.getenv("INFLUX_ORG"); + String bucket = System.getenv("INFLUX_BUCKET"); + // 👇 Добавь проверки + if (url == null || token == null || org == null || bucket == null) { + System.err.println("⚠️ InfluxDB environment variables are not set!"); + System.err.println("Set: INFLUX_URL, INFLUX_TOKEN, INFLUX_ORG, INFLUX_BUCKET"); + return; + } + + try (InfluxDBClient client = InfluxDBClientFactory.create(url, token.toCharArray(), org)) { + + String flux = String.format(""" + from(bucket: "%s") + |> range(start: -24h) + |> filter(fn: (r) => r["_measurement"] == "allure_test") + |> group(columns: ["status"]) + |> count() + """, bucket); + + List tables = client.getQueryApi().query(flux, org); + + System.out.println("🧪 Test results from InfluxDB (last 24h):"); + for (FluxTable table : tables) { + table.getRecords().forEach(rec -> { + System.out.printf("%s : %s%n", + rec.getValueByKey("status"), + rec.getValue()); + }); + } + + } catch (Exception e) { + System.err.println("⚠️ Failed to query InfluxDB: " + e.getMessage()); + } + } } From 4604bb907a8d4289d31337d719b79c5d3b618ebf Mon Sep 17 00:00:00 2001 From: Roman Burlaka Date: Wed, 22 Oct 2025 21:21:20 +0200 Subject: [PATCH 3/4] Added influx --- .github/workflows/ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 796dcb6..78e1cb2 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -12,6 +12,7 @@ jobs: build: name: 'Run tests' runs-on: ubuntu-latest + environment: gh-pages steps: # 1. Cloning From 50e871101b677ffebec416c59c3a7e5a452efb26 Mon Sep 17 00:00:00 2001 From: Roman Burlaka Date: Wed, 22 Oct 2025 21:52:33 +0200 Subject: [PATCH 4/4] Added influx --- .github/workflows/ci.yml | 1 - src/test/java/ui/testing/base/BasePage.java | 4 ++-- src/test/java/ui/testing/page/ClassAttributePage.java | 2 +- src/test/java/ui/testing/page/HiddenLayersPage.java | 2 +- src/test/java/ui/testing/page/LoadDelayPage.java | 2 +- 5 files changed, 5 insertions(+), 6 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 78e1cb2..796dcb6 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -12,7 +12,6 @@ jobs: build: name: 'Run tests' runs-on: ubuntu-latest - environment: gh-pages steps: # 1. Cloning diff --git a/src/test/java/ui/testing/base/BasePage.java b/src/test/java/ui/testing/base/BasePage.java index 619b9ef..0625dcf 100644 --- a/src/test/java/ui/testing/base/BasePage.java +++ b/src/test/java/ui/testing/base/BasePage.java @@ -18,7 +18,7 @@ public WebDriver getDriver() { return driver; } - public WebDriverWait wait4() { - return new WebDriverWait(getDriver(), Duration.ofSeconds(4)); + public WebDriverWait wait10() { + return new WebDriverWait(getDriver(), Duration.ofSeconds(10)); } } diff --git a/src/test/java/ui/testing/page/ClassAttributePage.java b/src/test/java/ui/testing/page/ClassAttributePage.java index b83c7fb..a8b2b7e 100644 --- a/src/test/java/ui/testing/page/ClassAttributePage.java +++ b/src/test/java/ui/testing/page/ClassAttributePage.java @@ -17,7 +17,7 @@ public ClassAttributePage(WebDriver driver) { public String getAlert() { buttonPrimary.click(); - wait4().until(ExpectedConditions.alertIsPresent()); + wait10().until(ExpectedConditions.alertIsPresent()); Alert alert = getDriver().switchTo().alert(); String text = alert.getText(); alert.accept(); diff --git a/src/test/java/ui/testing/page/HiddenLayersPage.java b/src/test/java/ui/testing/page/HiddenLayersPage.java index f76028d..e3763fd 100644 --- a/src/test/java/ui/testing/page/HiddenLayersPage.java +++ b/src/test/java/ui/testing/page/HiddenLayersPage.java @@ -15,7 +15,7 @@ public HiddenLayersPage(WebDriver driver) { public String notAllowedClickMoreThanOne() { String message = ""; boolean clickable = true; - WebElement enableButton = wait4().until(ExpectedConditions.elementToBeClickable(By.xpath("//button[@id = 'greenButton']"))); + WebElement enableButton = wait10().until(ExpectedConditions.elementToBeClickable(By.xpath("//button[@id = 'greenButton']"))); try { enableButton.click(); message = "Green button visible and clicked. Click : "; diff --git a/src/test/java/ui/testing/page/LoadDelayPage.java b/src/test/java/ui/testing/page/LoadDelayPage.java index 5a88e95..d0e317f 100644 --- a/src/test/java/ui/testing/page/LoadDelayPage.java +++ b/src/test/java/ui/testing/page/LoadDelayPage.java @@ -15,7 +15,7 @@ public LoadDelayPage(WebDriver driver) { @Step("Wait until button will be presence on page") public String confirmAppearedButton() { WebElement btnAppeared = getDriver().findElement(By.xpath("//button[@class = 'btn btn-primary']")); - wait4().until(ExpectedConditions.presenceOfAllElementsLocatedBy(By.xpath("//button[@class = 'btn btn-primary']"))); + wait10().until(ExpectedConditions.presenceOfAllElementsLocatedBy(By.xpath("//button[@class = 'btn btn-primary']"))); return btnAppeared.getText(); }