parent
70414d2279
commit
13d168c8a5
4 changed files with 122 additions and 97 deletions
|
@ -18,7 +18,7 @@ This repository is for E2E UI automation.
|
||||||
|
|
||||||
### Prerequisites
|
### Prerequisites
|
||||||
- Docker & Docker-compose
|
- Docker & Docker-compose
|
||||||
- Java
|
- Java (install aarch64 jdk if you have M1/arm chip)
|
||||||
- Maven
|
- Maven
|
||||||
|
|
||||||
### How to install
|
### How to install
|
||||||
|
|
|
@ -126,6 +126,12 @@
|
||||||
<artifactId>netty-transport-native-unix-common</artifactId>
|
<artifactId>netty-transport-native-unix-common</artifactId>
|
||||||
<version>${netty.version}</version>
|
<version>${netty.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.netty</groupId>
|
||||||
|
<artifactId>netty-resolver-dns-native-macos</artifactId>
|
||||||
|
<version>${netty.version}</version>
|
||||||
|
<classifier>osx-aarch_64</classifier>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.testcontainers</groupId>
|
<groupId>org.testcontainers</groupId>
|
||||||
|
@ -208,7 +214,7 @@
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.junit.platform</groupId>
|
<groupId>org.junit.platform</groupId>
|
||||||
<artifactId>junit-platform-launcher</artifactId>
|
<artifactId>junit-platform-launcher</artifactId>
|
||||||
<version>${junit.platform-launcher.version}</version>
|
<version>${junit.platform-launcher.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>ru.yandex.qatools.allure</groupId>
|
<groupId>ru.yandex.qatools.allure</groupId>
|
||||||
|
|
|
@ -14,10 +14,8 @@ public class TestConfiguration {
|
||||||
Boolean.parseBoolean(System.getProperty("SAVE_PAGE_SOURCE", "false"));
|
Boolean.parseBoolean(System.getProperty("SAVE_PAGE_SOURCE", "false"));
|
||||||
public static Boolean REOPEN_BROWSER_ON_FAIL =
|
public static Boolean REOPEN_BROWSER_ON_FAIL =
|
||||||
Boolean.parseBoolean(System.getProperty("REOPEN_BROWSER_ON_FAIL", "true"));
|
Boolean.parseBoolean(System.getProperty("REOPEN_BROWSER_ON_FAIL", "true"));
|
||||||
public static String BROWSER = System.getProperty("BROWSER", "chrome");
|
public static String BROWSER = System.getProperty("BROWSER", "chromium");
|
||||||
public static String BROWSER_SIZE = System.getProperty("BROWSER_SIZE", "1920x1080");
|
public static String BROWSER_SIZE = System.getProperty("BROWSER_SIZE", "1920x1080");
|
||||||
public static Boolean ENABLE_VNC = Boolean.parseBoolean(System.getProperty("ENABLE_VNC", "true"));
|
public static Boolean ENABLE_VNC = Boolean.parseBoolean(System.getProperty("ENABLE_VNC", "true"));
|
||||||
public static String IMAGE_NAME = System.getProperty("SELENIUM_DOCKER_IMAGE", "selenium/standalone-chrome");
|
|
||||||
public static String IMAGE_TAG = System.getProperty("SELENIUM_IMAGE_TAG", "103.0");
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,10 +12,18 @@ import com.provectus.kafka.ui.utils.qaseIO.TestCaseGenerator;
|
||||||
import io.github.cdimascio.dotenv.Dotenv;
|
import io.github.cdimascio.dotenv.Dotenv;
|
||||||
import io.qameta.allure.Allure;
|
import io.qameta.allure.Allure;
|
||||||
import io.qameta.allure.selenide.AllureSelenide;
|
import io.qameta.allure.selenide.AllureSelenide;
|
||||||
|
import java.io.ByteArrayInputStream;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.Arrays;
|
||||||
import lombok.SneakyThrows;
|
import lombok.SneakyThrows;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.apache.commons.io.FileUtils;
|
import org.apache.commons.io.FileUtils;
|
||||||
import org.junit.jupiter.api.*;
|
import org.junit.jupiter.api.AfterAll;
|
||||||
|
import org.junit.jupiter.api.AfterEach;
|
||||||
|
import org.junit.jupiter.api.BeforeAll;
|
||||||
|
import org.junit.jupiter.api.BeforeEach;
|
||||||
|
import org.junit.jupiter.api.DisplayNameGeneration;
|
||||||
import org.openqa.selenium.Dimension;
|
import org.openqa.selenium.Dimension;
|
||||||
import org.openqa.selenium.OutputType;
|
import org.openqa.selenium.OutputType;
|
||||||
import org.openqa.selenium.TakesScreenshot;
|
import org.openqa.selenium.TakesScreenshot;
|
||||||
|
@ -26,112 +34,125 @@ import org.testcontainers.containers.BrowserWebDriverContainer;
|
||||||
import org.testcontainers.containers.wait.strategy.Wait;
|
import org.testcontainers.containers.wait.strategy.Wait;
|
||||||
import org.testcontainers.utility.DockerImageName;
|
import org.testcontainers.utility.DockerImageName;
|
||||||
|
|
||||||
import java.io.ByteArrayInputStream;
|
|
||||||
import java.io.File;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.util.Arrays;
|
|
||||||
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@DisplayNameGeneration(CamelCaseToSpacedDisplayNameGenerator.class)
|
@DisplayNameGeneration(CamelCaseToSpacedDisplayNameGenerator.class)
|
||||||
public class BaseTest {
|
public class BaseTest {
|
||||||
|
|
||||||
protected Pages pages = Pages.INSTANCE;
|
public static final String SELENIUM_IMAGE_NAME = "selenium/standalone-chrome";
|
||||||
protected Helpers helpers = Helpers.INSTANCE;
|
public static final String SELENIARM_STANDALONE_CHROMIUM = "seleniarm/standalone-chromium";
|
||||||
|
protected Pages pages = Pages.INSTANCE;
|
||||||
|
protected Helpers helpers = Helpers.INSTANCE;
|
||||||
|
|
||||||
private Screenshooter screenshooter = new Screenshooter();
|
private Screenshooter screenshooter = new Screenshooter();
|
||||||
|
|
||||||
private static final String IMAGE_NAME = TestConfiguration.IMAGE_NAME;
|
protected static BrowserWebDriverContainer<?> webDriverContainer = null;
|
||||||
private static final String IMAGE_TAG = TestConfiguration.IMAGE_TAG;
|
|
||||||
protected static BrowserWebDriverContainer<?> webDriverContainer = null;
|
|
||||||
|
|
||||||
public void compareScreenshots(String name) {
|
public void compareScreenshots(String name) {
|
||||||
screenshooter.compareScreenshots(name);
|
screenshooter.compareScreenshots(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void compareScreenshots(String name, Boolean shouldUpdateScreenshots) {
|
||||||
|
screenshooter.compareScreenshots(name, shouldUpdateScreenshots);
|
||||||
|
}
|
||||||
|
|
||||||
|
@BeforeEach
|
||||||
|
public void setWebDriver() {
|
||||||
|
RemoteWebDriver remoteWebDriver = webDriverContainer.getWebDriver();
|
||||||
|
WebDriverRunner.setWebDriver(remoteWebDriver);
|
||||||
|
remoteWebDriver.manage().window().setSize(new Dimension(1440, 1024));
|
||||||
|
}
|
||||||
|
|
||||||
|
@BeforeAll
|
||||||
|
public static void start() {
|
||||||
|
|
||||||
|
DockerImageName image = isARM64()
|
||||||
|
? DockerImageName.parse(SELENIARM_STANDALONE_CHROMIUM).asCompatibleSubstituteFor(SELENIUM_IMAGE_NAME)
|
||||||
|
: DockerImageName.parse(SELENIUM_IMAGE_NAME);
|
||||||
|
log.info("Using [{}] as image name for chrome", image.getUnversionedPart());
|
||||||
|
|
||||||
|
webDriverContainer = new BrowserWebDriverContainer<>(image)
|
||||||
|
.withEnv("JAVA_OPTS", "-Dwebdriver.chrome.whitelistedIps=")
|
||||||
|
.withCapabilities(new ChromeOptions()
|
||||||
|
.addArguments("--disable-dev-shm-usage")
|
||||||
|
.addArguments("--verbose")
|
||||||
|
)
|
||||||
|
.waitingFor(Wait.forHttp("/"))
|
||||||
|
//.withLogConsumer(new Slf4jLogConsumer(log).withPrefix("[CHROME]: ")) // uncomment for debugging
|
||||||
|
.waitingFor(Wait.forLogMessage(".*Started Selenium Standalone.*", 1));
|
||||||
|
try {
|
||||||
|
Testcontainers.exposeHostPorts(8080);
|
||||||
|
webDriverContainer.start();
|
||||||
|
} catch (Throwable e) {
|
||||||
|
log.error("Couldn't start a container", e);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void compareScreenshots(String name, Boolean shouldUpdateScreenshots) {
|
@AfterAll
|
||||||
screenshooter.compareScreenshots(name, shouldUpdateScreenshots);
|
public static void tearDown() {
|
||||||
|
if (webDriverContainer.isRunning()) {
|
||||||
|
webDriverContainer.close();
|
||||||
|
webDriverContainer.stop();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@BeforeEach
|
static {
|
||||||
public void setWebDriver() {
|
if (!new File("./.env").exists()) {
|
||||||
RemoteWebDriver remoteWebDriver = webDriverContainer.getWebDriver();
|
try {
|
||||||
WebDriverRunner.setWebDriver(remoteWebDriver);
|
FileUtils.copyFile(new File(".env.example"), new File(".env"));
|
||||||
remoteWebDriver.manage().window().setSize(new Dimension(1440, 1024));
|
} catch (IOException e) {
|
||||||
|
log.error("couldn't copy .env.example to .env. Please add .env");
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Dotenv.load().entries().forEach(env -> System.setProperty(env.getKey(), env.getValue()));
|
||||||
|
if (TestConfiguration.CLEAR_REPORTS_DIR) {
|
||||||
|
clearReports();
|
||||||
|
}
|
||||||
|
setup();
|
||||||
|
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
|
||||||
|
if (TestCaseGenerator.FAILED) {
|
||||||
|
log.error(
|
||||||
|
"Tests FAILED because some problem with @CaseId annotation. Verify that all tests annotated with @CaseId and Id is correct!");
|
||||||
|
Runtime.getRuntime().halt(100500);
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
@BeforeAll
|
@AfterEach
|
||||||
public static void start() {
|
public void afterMethod() {
|
||||||
DockerImageName image = DockerImageName.parse(IMAGE_NAME).withTag(IMAGE_TAG);
|
Allure.addAttachment("Screenshot",
|
||||||
webDriverContainer = new BrowserWebDriverContainer<>(image)
|
new ByteArrayInputStream(
|
||||||
.withCapabilities(new ChromeOptions().addArguments("--disable-dev-shm-usage"))
|
((TakesScreenshot) webDriverContainer.getWebDriver()).getScreenshotAs(OutputType.BYTES)));
|
||||||
.waitingFor(Wait.forHttp("/"))
|
}
|
||||||
.waitingFor(Wait.forLogMessage(".*Started Selenium Standalone.*", 1));
|
|
||||||
Testcontainers.exposeHostPorts(8080);
|
|
||||||
webDriverContainer.start();
|
|
||||||
webDriverContainer.isRunning();
|
|
||||||
webDriverContainer.isHostAccessible();
|
|
||||||
}
|
|
||||||
|
|
||||||
@AfterAll
|
@SneakyThrows
|
||||||
public static void tearDown() {
|
private static void setup() {
|
||||||
if (webDriverContainer.isRunning()) {
|
Configuration.reportsFolder = TestConfiguration.REPORTS_FOLDER;
|
||||||
webDriverContainer.close();
|
Configuration.screenshots = TestConfiguration.SCREENSHOTS;
|
||||||
webDriverContainer.stop();
|
Configuration.savePageSource = TestConfiguration.SAVE_PAGE_SOURCE;
|
||||||
}
|
Configuration.reopenBrowserOnFail = TestConfiguration.REOPEN_BROWSER_ON_FAIL;
|
||||||
}
|
Configuration.browser = TestConfiguration.BROWSER;
|
||||||
|
Configuration.baseUrl = TestConfiguration.BASE_WEB_URL;
|
||||||
|
Configuration.timeout = 10000;
|
||||||
|
Configuration.browserSize = TestConfiguration.BROWSER_SIZE;
|
||||||
|
SelenideLogger.addListener("allure", new AllureSelenide().savePageSource(false));
|
||||||
|
}
|
||||||
|
|
||||||
static {
|
public static void clearReports() {
|
||||||
if (!new File("./.env").exists()) {
|
log.info(String.format("Clearing reports dir [%s]...", TestConfiguration.REPORTS_FOLDER));
|
||||||
try {
|
File allureResults = new File(TestConfiguration.REPORTS_FOLDER);
|
||||||
FileUtils.copyFile(new File(".env.example"), new File(".env"));
|
if (allureResults.isDirectory()) {
|
||||||
} catch (IOException e) {
|
File[] list = allureResults.listFiles();
|
||||||
log.error("couldn't copy .env.example to .env. Please add .env");
|
if (list != null) {
|
||||||
e.printStackTrace();
|
Arrays.stream(list)
|
||||||
}
|
.sequential()
|
||||||
}
|
.filter(e -> !e.getName().equals("categories.json"))
|
||||||
Dotenv.load().entries().forEach(env -> System.setProperty(env.getKey(), env.getValue()));
|
.forEach(File::delete);
|
||||||
if (TestConfiguration.CLEAR_REPORTS_DIR) {
|
}
|
||||||
clearReports();
|
|
||||||
}
|
|
||||||
setup();
|
|
||||||
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
|
|
||||||
if (TestCaseGenerator.FAILED) {
|
|
||||||
log.error("Tests FAILED because some problem with @CaseId annotation. Verify that all tests annotated with @CaseId and Id is correct!");
|
|
||||||
Runtime.getRuntime().halt(100500);
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@AfterEach
|
private static boolean isARM64() {
|
||||||
public void afterMethod() {
|
return System.getProperty("os.arch").equals("aarch64");
|
||||||
Allure.addAttachment("Screenshot",
|
}
|
||||||
new ByteArrayInputStream(((TakesScreenshot) webDriverContainer.getWebDriver()).getScreenshotAs(OutputType.BYTES)));
|
|
||||||
}
|
|
||||||
|
|
||||||
@SneakyThrows
|
|
||||||
private static void setup() {
|
|
||||||
Configuration.reportsFolder = TestConfiguration.REPORTS_FOLDER;
|
|
||||||
Configuration.screenshots = TestConfiguration.SCREENSHOTS;
|
|
||||||
Configuration.savePageSource = TestConfiguration.SAVE_PAGE_SOURCE;
|
|
||||||
Configuration.reopenBrowserOnFail = TestConfiguration.REOPEN_BROWSER_ON_FAIL;
|
|
||||||
Configuration.browser = TestConfiguration.BROWSER;
|
|
||||||
Configuration.baseUrl = TestConfiguration.BASE_WEB_URL;
|
|
||||||
Configuration.timeout = 10000;
|
|
||||||
Configuration.browserSize = TestConfiguration.BROWSER_SIZE;
|
|
||||||
SelenideLogger.addListener("allure", new AllureSelenide().savePageSource(false));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void clearReports() {
|
|
||||||
log.info(String.format("Clearing reports dir [%s]...", TestConfiguration.REPORTS_FOLDER));
|
|
||||||
File allureResults = new File(TestConfiguration.REPORTS_FOLDER);
|
|
||||||
if (allureResults.isDirectory()) {
|
|
||||||
File[] list = allureResults.listFiles();
|
|
||||||
if (list != null) {
|
|
||||||
Arrays.stream(list)
|
|
||||||
.sequential()
|
|
||||||
.filter(e -> !e.getName().equals("categories.json"))
|
|
||||||
.forEach(File::delete);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue