{"id":15055656,"url":"https://github.com/testfx/testfx","last_synced_at":"2025-05-15T05:07:42.869Z","repository":{"id":9524660,"uuid":"11424225","full_name":"TestFX/TestFX","owner":"TestFX","description":"Simple and clean testing for JavaFX.","archived":false,"fork":false,"pushed_at":"2024-02-12T00:09:38.000Z","size":10593,"stargazers_count":941,"open_issues_count":158,"forks_count":171,"subscribers_count":59,"default_branch":"master","last_synced_at":"2025-05-15T05:07:41.049Z","etag":null,"topics":["javafx","testfx"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/TestFX.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGES.md","contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2013-07-15T13:49:09.000Z","updated_at":"2025-05-12T01:24:20.000Z","dependencies_parsed_at":"2024-06-19T02:52:46.856Z","dependency_job_id":"c2cfc39d-e843-446a-8ef8-9b511e0d7f42","html_url":"https://github.com/TestFX/TestFX","commit_stats":null,"previous_names":["smartbear/testfx"],"tags_count":21,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TestFX%2FTestFX","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TestFX%2FTestFX/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TestFX%2FTestFX/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TestFX%2FTestFX/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/TestFX","download_url":"https://codeload.github.com/TestFX/TestFX/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254276447,"owners_count":22043867,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["javafx","testfx"],"created_at":"2024-09-24T21:45:23.360Z","updated_at":"2025-05-15T05:07:42.836Z","avatar_url":"https://github.com/TestFX.png","language":"Java","readme":"# TestFX 4\n\n[![TestFX 4 CI](https://github.com/TestFX/TestFX/actions/workflows/entry.yml/badge.svg)](https://github.com/TestFX/TestFX/actions/workflows/entry.yml)\n[![Maven Central](https://img.shields.io/maven-central/v/org.testfx/testfx-core.svg?label=maven\u0026style=flat-square)](https://search.maven.org/#search|ga|1|org.testfx)\n[![Chat on Gitter](https://img.shields.io/gitter/room/testfx/testfx-core.svg?style=flat-square)](https://gitter.im/TestFX/TestFX)\n\nSimple and clean testing for JavaFX.\n\nTestFX 4 requires Java version of 8 (1.8), or higher, and has only legacy support.\n\n## Documentation\n\n* See the [Javadocs](https://testfx.github.io/TestFX/docs/javadoc/) for latest `master`.\n* See the changelog [CHANGES.md](https://github.com/TestFX/TestFX/blob/master/CHANGES.md) for latest released version.\n\n## Features\n\n- A fluent and clean API.\n- Flexible setup and cleanup of JavaFX test fixtures.\n- Simple robots to simulate user interactions.\n- Rich collection of matchers and assertions to verify expected states of JavaFX scene-graph nodes.\n\n**Support for:**\n\n- Java 8/11/17+\n- Multiple testing frameworks ([JUnit 4](https://junit.org/junit4/), [JUnit 5](https://junit.org/junit5/), and [Spock](http://spockframework.org/)).\n- [Hamcrest](http://hamcrest.org/) matchers or [AssertJ](https://assertj.github.io/doc/) assertions (or both!).\n- Screenshots of failed tests.\n- Headless testing using [Monocle](https://github.com/TestFX/Monocle).\n\n## Gradle\n\nTo add a dependency on TestFX using Gradle, use the following:\n\n```gradle\ndependencies {\n    testCompile \"org.testfx:testfx-core:4.0.18\"\n}\n```\n\n### Java 11+\nBeginning with Java 11, JavaFX is no longer part of the JDK. It has been extracted to its own project: [OpenJFX](https://openjfx.io). This means, extra dependencies must be added to your project.\n\nThe easiest way to add the JavaFX libraries to your Gradle project is to use the [JavaFX Gradle Plugin](https://github.com/openjfx/javafx-gradle-plugin).\n\nAfter following the README for the JavaFX Gradle Plugin you will end up with something like:\n\n```gradle\nplugins {\n    id 'org.openjfx.javafxplugin' version '0.0.8'\n}\n\njavafx {\n    version = '12'\n    modules = [ 'javafx.controls', 'javafx.fxml' ]\n}\n```\n\n### Test Framework\nNext add a dependency corresponding to the testing framework you are using in your project. TestFX currently supports JUnit 4, JUnit 5, and Spock.\n\n#### JUnit 4\n\n```gradle\ndependencies {\n    testCompile \"junit:junit:4.13-beta-3\"\n    testCompile \"org.testfx:testfx-junit:4.0.18\"\n}\n```\n\n#### JUnit 5\n\n```gradle\ndependencies {\n    testCompile 'org.junit.jupiter:junit-jupiter-api:5.5.1'\n    testCompile \"org.testfx:testfx-junit5:4.0.18\"\n}\n```\n\n#### Spock\n\n```gradle\ndependencies {\n    testCompile \"org.spockframework:spock-core:1.3-groovy-2.5\"\n    testCompile \"org.testfx:testfx-spock:4.0.18\"\n}\n```\n### Matcher/Assertions Library\nFinally you must add a dependency corresponding to the matcher/assertions libraries that you want to use with TestFX. TestFX currently supports Hamcrest matchers or AssertJ assertions.\n\n#### Hamcrest\n```gradle\ntestCompile group: 'org.hamcrest', name: 'hamcrest', version: '2.1'\n```\n\n#### AssertJ\n```gradle\ntestCompile group: 'org.assertj', name: 'assertj-core', version: '3.13.2'\n```\n\n## Maven\n\nTo add a dependency on TestFX using Maven, use the following:\n\n```xml\n\u003cdependency\u003e\n    \u003cgroupId\u003eorg.testfx\u003c/groupId\u003e\n    \u003cartifactId\u003etestfx-core\u003c/artifactId\u003e\n    \u003cversion\u003e4.0.18\u003c/version\u003e\n    \u003cscope\u003etest\u003c/scope\u003e\n\u003c/dependency\u003e\n```\n\n### Java 11+\nBeginning with Java 11, JavaFX is no longer part of the JDK. It has been extracted to its own project: [OpenJFX](https://openjfx.io). This means, extra dependencies must be added to your project.\n\nThe easiest way to add the JavaFX libraries to your Maven project is to use the [JavaFX Maven Plugin](https://github.com/openjfx/javafx-maven-plugin).\n\nAfter following the README for the JavaFX Maven Plugin you will end up with something like:\n\n```xml\n\u003cdependencies\u003e\n    \u003cdependency\u003e\n        \u003cgroupId\u003eorg.openjfx\u003c/groupId\u003e\n        \u003cartifactId\u003ejavafx-controls\u003c/artifactId\u003e\n        \u003cversion\u003e12.0.2\u003c/version\u003e\n    \u003c/dependency\u003e\n\u003c/dependencies\u003e\n\n\u003cplugins\u003e\n    \u003cplugin\u003e\n        \u003cgroupId\u003eorg.openjfx\u003c/groupId\u003e\n        \u003cartifactId\u003ejavafx-maven-plugin\u003c/artifactId\u003e\n        \u003cversion\u003e0.0.3\u003c/version\u003e\n        \u003cconfiguration\u003e\n            \u003cmainClass\u003ehellofx/org.openjfx.App\u003c/mainClass\u003e\n        \u003c/configuration\u003e\n    \u003c/plugin\u003e\n\u003c/plugins\u003e\n```\n\nHave a look at [Maven Central's org.openjfx](https://mvnrepository.com/artifact/org.openjfx) entry for an overview of available modules.\n\n### Test Framework\nNext add a dependency corresponding to the testing framework you are using in your project. TestFX currently supports JUnit 4, JUnit 5, and Spock.\n\n#### JUnit 4\n\n```xml\n\u003cdependency\u003e\n    \u003cgroupId\u003ejunit\u003c/groupId\u003e\n    \u003cartifactId\u003ejunit\u003c/artifactId\u003e\n    \u003cversion\u003e4.13-beta-3\u003c/version\u003e\n    \u003cscope\u003etest\u003c/scope\u003e\n\u003c/dependency\u003e\n\u003cdependency\u003e\n    \u003cgroupId\u003eorg.testfx\u003c/groupId\u003e\n    \u003cartifactId\u003etestfx-junit\u003c/artifactId\u003e\n    \u003cversion\u003e4.0.18\u003c/version\u003e\n    \u003cscope\u003etest\u003c/scope\u003e\n\u003c/dependency\u003e\n```\n\n#### JUnit 5\n\n```xml\n\u003cdependency\u003e\n    \u003cgroupId\u003eorg.junit.jupiter\u003c/groupId\u003e\n    \u003cartifactId\u003ejunit-jupiter-api\u003c/artifactId\u003e\n    \u003cversion\u003e5.5.1\u003c/version\u003e\n    \u003cscope\u003etest\u003c/scope\u003e\n\u003c/dependency\u003e\n\u003cdependency\u003e\n    \u003cgroupId\u003eorg.testfx\u003c/groupId\u003e\n    \u003cartifactId\u003etestfx-junit5\u003c/artifactId\u003e\n    \u003cversion\u003e4.0.18\u003c/version\u003e\n    \u003cscope\u003etest\u003c/scope\u003e\n\u003c/dependency\u003e\n```\n\n#### Spock\n\n```xml\n\u003cdependency\u003e\n    \u003cgroupId\u003eorg.spockframework\u003c/groupId\u003e\n    \u003cartifactId\u003espock-core\u003c/artifactId\u003e\n    \u003cversion\u003e1.3-groovy-2.5\u003c/version\u003e\n    \u003cscope\u003etest\u003c/scope\u003e\n\u003c/dependency\u003e\n\u003cdependency\u003e\n    \u003cgroupId\u003eorg.testfx\u003c/groupId\u003e\n    \u003cartifactId\u003etestfx-spock\u003c/artifactId\u003e\n    \u003cversion\u003e4.0.18\u003c/version\u003e\n    \u003cscope\u003etest\u003c/scope\u003e\n\u003c/dependency\u003e\n```\n\n### Matcher/Assertions Library\nFinally you must add a dependency corresponding to the matcher/assertions libraries that you want to use with TestFX. TestFX currently supports Hamcrest matchers or AssertJ assertions.\n\n#### Hamcrest\n```xml\n\u003cdependency\u003e\n    \u003cgroupId\u003eorg.hamcrest\u003c/groupId\u003e\n    \u003cartifactId\u003ehamcrest\u003c/artifactId\u003e\n    \u003cversion\u003e2.1\u003c/version\u003e\n    \u003cscope\u003etest\u003c/scope\u003e\n\u003c/dependency\u003e\n```\n\n#### AssertJ\n```xml\n\u003cdependency\u003e\n    \u003cgroupId\u003eorg.assertj\u003c/groupId\u003e\n    \u003cartifactId\u003eassertj-core\u003c/artifactId\u003e\n    \u003cversion\u003e3.13.2\u003c/version\u003e\n    \u003cscope\u003etest\u003c/scope\u003e\n\u003c/dependency\u003e\n```\n\n## Examples\n\n### Hamcrest Matchers\nTestFX brings along a couple of custom Hamcrest matchers in package `org.testfx.matcher.*`.\n\n### AssertJ based Assertions\nTestFX uses its own AssertJ based assertion implementation class: `org.testfx.assertions.api.Assertions`.\n\n#### JUnit 4 with Hamcrest Matchers\n\n```java\nimport org.junit.Test;\nimport org.testfx.api.FxAssert;\nimport org.testfx.framework.junit.ApplicationTest;\nimport org.testfx.matcher.control.LabeledMatchers;\n\nimport javafx.scene.Scene;\nimport javafx.scene.control.Button;\nimport javafx.scene.layout.StackPane;\nimport javafx.stage.Stage;\n\npublic class ClickableButtonTest_JUnit4Hamcrest extends ApplicationTest {\n\n    private Button button;\n\n    /**\n     * Will be called with {@code @Before} semantics, i. e. before each test method.\n     */\n    @Override\n    public void start(Stage stage) {\n        button = new Button(\"click me!\");\n        button.setOnAction(actionEvent -\u003e button.setText(\"clicked!\"));\n        stage.setScene(new Scene(new StackPane(button), 100, 100));\n        stage.show();\n    }\n\n    @Test\n    public void should_contain_button_with_text() {\n        FxAssert.verifyThat(\".button\", LabeledMatchers.hasText(\"click me!\"));\n    }\n\n    @Test\n    public void when_button_is_clicked_text_changes() {\n        // when:\n        clickOn(\".button\");\n\n        // then:\n        FxAssert.verifyThat(\".button\", LabeledMatchers.hasText(\"clicked!\"));\n    }\n}\n```\n\n#### JUnit 4 with AssertJ based Assertions \n\n```java\nimport org.junit.Test;\nimport org.testfx.assertions.api.Assertions;\nimport org.testfx.framework.junit.ApplicationTest;\n\nimport javafx.scene.Scene;\nimport javafx.scene.control.Button;\nimport javafx.scene.layout.StackPane;\nimport javafx.stage.Stage;\n\npublic class ClickableButtonTest_JUnit4AssertJ extends ApplicationTest {\n\n    private Button button;\n\n    /**\n     * Will be called with {@code @Before} semantics, i. e. before each test method.\n     */\n    @Override\n    public void start(Stage stage) {\n        button = new Button(\"click me!\");\n        button.setOnAction(actionEvent -\u003e button.setText(\"clicked!\"));\n        stage.setScene(new Scene(new StackPane(button), 100, 100));\n        stage.show();\n    }\n\n    @Test\n    public void should_contain_button_with_text() {\n        Assertions.assertThat(button).hasText(\"click me!\");\n    }\n\n    @Test\n    public void when_button_is_clicked_text_changes() {\n        // when:\n        clickOn(\".button\");\n\n        // then:\n        Assertions.assertThat(button).hasText(\"clicked!\");\n    }\n}\n```\n\n### JUnit 5 \nTestFX uses [JUnit5's new extension mechanism](https://junit.org/junit5/docs/current/user-guide/#extensions) via `org.junit.jupiter.api.extension.ExtendWith`. By using this, implementors are not forced anymore to inherit from `ApplicationTest` and are free to choose their own super classes. \n  \nIt does also make use of [JUnit5's new dependency injection mechanism](https://junit.org/junit5/docs/current/user-guide/#writing-tests-dependency-injection). By using this, test methods have access to the `FxRobot` instance that must be used in order to execute actions within the UI.\n\n##### JUnit 5 with Hamcrest Matchers\n\n```java\nimport org.junit.jupiter.api.Test;\nimport org.junit.jupiter.api.extension.ExtendWith;\nimport org.testfx.api.FxAssert;\nimport org.testfx.api.FxRobot;\nimport org.testfx.framework.junit5.ApplicationExtension;\nimport org.testfx.framework.junit5.Start;\nimport org.testfx.matcher.control.LabeledMatchers;\n\nimport javafx.scene.Scene;\nimport javafx.scene.control.Button;\nimport javafx.scene.layout.StackPane;\nimport javafx.stage.Stage;\n\n@ExtendWith(ApplicationExtension.class)\nclass ClickableButtonTest_JUnit5Hamcrest {\n\n    private Button button;\n\n    /**\n     * Will be called with {@code @Before} semantics, i. e. before each test method.\n     *\n     * @param stage - Will be injected by the test runner.\n     */\n    @Start\n    private void start(Stage stage) {\n        button = new Button(\"click me!\");\n        button.setId(\"myButton\");\n        button.setOnAction(actionEvent -\u003e button.setText(\"clicked!\"));\n        stage.setScene(new Scene(new StackPane(button), 100, 100));\n        stage.show();\n    }\n\n    /**\n     * @param robot - Will be injected by the test runner.\n     */\n    @Test\n    void should_contain_button_with_text(FxRobot robot) {\n        FxAssert.verifyThat(button, LabeledMatchers.hasText(\"click me!\"));\n        // or (lookup by css id):\n        FxAssert.verifyThat(\"#myButton\", LabeledMatchers.hasText(\"click me!\"));\n        // or (lookup by css class):\n        FxAssert.verifyThat(\".button\", LabeledMatchers.hasText(\"click me!\"));\n    }\n\n    /**\n     * @param robot - Will be injected by the test runner.\n     */\n    @Test\n    void when_button_is_clicked_text_changes(FxRobot robot) {\n        // when:\n        robot.clickOn(\".button\");\n\n        // then:\n        FxAssert.verifyThat(button, LabeledMatchers.hasText(\"clicked!\"));\n        // or (lookup by css id):\n        FxAssert.verifyThat(\"#myButton\", LabeledMatchers.hasText(\"clicked!\"));\n        // or (lookup by css class):\n        FxAssert.verifyThat(\".button\", LabeledMatchers.hasText(\"clicked!\"));\n    }\n}\n```\n\n#### JUnit 5 with AssertJ Assertions\n\n```java\nimport org.junit.jupiter.api.Test;\nimport org.junit.jupiter.api.extension.ExtendWith;\nimport org.testfx.api.FxRobot;\nimport org.testfx.assertions.api.Assertions;\nimport org.testfx.framework.junit5.ApplicationExtension;\nimport org.testfx.framework.junit5.Start;\n\nimport javafx.scene.Scene;\nimport javafx.scene.control.Button;\nimport javafx.scene.layout.StackPane;\nimport javafx.stage.Stage;\n\n@ExtendWith(ApplicationExtension.class)\nclass ClickableButtonTest_JUnit5AssertJ {\n\n    private Button button;\n\n    /**\n     * Will be called with {@code @Before} semantics, i. e. before each test method.\n     *\n     * @param stage - Will be injected by the test runner.\n     */\n    @Start\n    private void start(Stage stage) {\n        button = new Button(\"click me!\");\n        button.setId(\"myButton\");\n        button.setOnAction(actionEvent -\u003e button.setText(\"clicked!\"));\n        stage.setScene(new Scene(new StackPane(button), 100, 100));\n        stage.show();\n    }\n\n    /**\n     * @param robot - Will be injected by the test runner.\n     */\n    @Test\n    void should_contain_button_with_text(FxRobot robot) {\n        Assertions.assertThat(button).hasText(\"click me!\");\n        // or (lookup by css id):\n        Assertions.assertThat(robot.lookup(\"#myButton\").queryAs(Button.class)).hasText(\"click me!\");\n        // or (lookup by css class):\n        Assertions.assertThat(robot.lookup(\".button\").queryAs(Button.class)).hasText(\"click me!\");\n        // or (query specific type):\n        Assertions.assertThat(robot.lookup(\".button\").queryButton()).hasText(\"click me!\");\n    }\n\n    /**\n     * @param robot - Will be injected by the test runner.\n     */\n    @Test\n    void when_button_is_clicked_text_changes(FxRobot robot) {\n        // when:\n        robot.clickOn(\".button\");\n\n        // then:\n        Assertions.assertThat(button).hasText(\"clicked!\");\n        // or (lookup by css id):\n        Assertions.assertThat(robot.lookup(\"#myButton\").queryAs(Button.class)).hasText(\"clicked!\");\n        // or (lookup by css class):\n        Assertions.assertThat(robot.lookup(\".button\").queryAs(Button.class)).hasText(\"clicked!\");\n        // or (query specific type)\n        Assertions.assertThat(robot.lookup(\".button\").queryButton()).hasText(\"clicked!\");\n    }\n}\n```\n\n### Spock with Hamcrest Matchers\n\n```java\nimport org.testfx.framework.spock.ApplicationSpec;\n\nclass ClickableButtonSpec extends ApplicationSpec {\n    @Override\n    void init() throws Exception {\n        FxToolkit.registerStage { new Stage() }\n    }\n\n    @Override\n    void start(Stage stage) {\n        Button button = new Button('click me!')\n        button.setOnAction { button.setText('clicked!') }\n        stage.setScene(new Scene(new StackPane(button), 100, 100))\n        stage.show()\n    }\n\n    @Override\n    void stop() throws Exception {\n        FxToolkit.hideStage()\n    }\n\n    def \"should contain button\"() {\n        expect:\n        verifyThat('.button', hasText('click me!'))\n    }\n\n    def \"should click on button\"() {\n        when:\n        clickOn(\".button\")\n\n        then:\n        verifyThat('.button', hasText('clicked!'))\n    }\n}\n```\n\n## Continuous Integration (CI)\n\n### Travis CI\n\nTo run TestFX tests as part of your Travis CI build on Ubuntu and/or macOS\ntake the following steps:\n\n1. Ensure that your unit tests are triggered as part of your build script. This\n   is usually the default case when using Maven or Gradle.\n2. If you wish to test in a headless environment your must add [Monocle](https://github.com/TestFX/Monocle)\n    as a test dependency:\n\n    `build.gradle`\n    ```gradle\n    dependencies {\n        testCompile \"org.testfx:openjfx-monocle:8u76-b04\" // jdk-9+181 for Java 9, jdk-11+26 for Java 11\n    }\n    ```\n\n    `pom.xml`\n    ```xml\n    \u003cdependency\u003e\n        \u003cgroupId\u003eorg.testfx\u003c/groupId\u003e\n        \u003cartifactId\u003eopenjfx-monocle\u003c/artifactId\u003e\n        \u003cversion\u003e8u76-b04\u003c/version\u003e \u003c!-- jdk-9+181 for Java 9, jdk-11+26 for Java 11 --\u003e\n        \u003cscope\u003etest\u003c/scope\u003e\n    \u003c/dependency\u003e\n    ```\n3. Base your Travis configuration on the following. Some different build variations are shown (Glass/AWT robot,\n    Headed/Headless, (Hi)DPI, etc.) adjust the build matrix to your requirements.\n\n    `.travis.yml`\n    ``` yaml\n    language: java\n\n    sudo: false   # Linux OS: run in container\n\n    matrix:\n      include:\n        # Ubuntu Linux (trusty) / Oracle JDK 8 / Headed (AWT Robot)\n        - os: linux\n          dist: trusty\n          jdk: oraclejdk8\n          env:\n            - _JAVA_OPTIONS=\"-Dtestfx.robot=awt\"\n        # Ubuntu Linux (trusty) / Oracle JDK 8 / Headed (Glass Robot) / HiDPI\n        - os: linux\n          dist: trusty\n          jdk: oraclejdk8\n          env:\n            - _JAVA_OPTIONS=\"-Dtestfx.robot=glass -Dglass.gtk.uiScale=2.0\"\n        # Ubuntu Linux (trusty) / Oracle JDK 8 / Headless\n        - os: linux\n          dist: trusty\n          jdk: oraclejdk8\n          env:\n            - _JAVA_OPTIONS=\"-Djava.awt.headless=true -Dtestfx.robot=glass -Dtestfx.headless=true -Dprism.order=sw\"\n        # macOS / Oracle JDK 8 / Headless\n        - os: osx\n          osx_image: xcode9.4\n          jdk: oraclejdk8\n          env:\n            - _JAVA_OPTIONS=\"-Djava.awt.headless=true -Dtestfx.robot=glass -Dtestfx.headless=true -Dprism.order=sw -Dprism.verbose=true\"\n        # Headed macOS is not currently possible on Travis.\n\n    addons:\n      apt:\n        packages:\n          - oracle-java8-installer\n\n    before_install:\n      - if [[ \"${TRAVIS_OS_NAME}\" == linux ]]; then export DISPLAY=:99.0; sh -e /etc/init.d/xvfb start; fi\n\n    install: true\n\n    before_script:\n      - if [[ \"${TRAVIS_OS_NAME}\" == osx ]]; then brew update; brew cask reinstall caskroom/versions/java8; fi\n\n    script:\n      - ./gradlew check\n\n    before_cache:\n      - rm -f  $HOME/.gradle/caches/modules-2/modules-2.lock\n      - rm -fr $HOME/.gradle/caches/*/plugin-resolution/\n      - rm -f  $HOME/.gradle/caches/*/fileHashes/fileHashes.bin\n      - rm -f  $HOME/.gradle/caches/*/fileHashes/fileHashes.lock\n\n    cache:\n      directories:\n        - $HOME/.gradle/caches/\n        - $HOME/.gradle/wrapper/\n        - $HOME/.m2\n    ```\n\nYour TestFX tests should now run as part of your Travis CI build.\n\n### Appveyor (Windows)\n\nTo run TestFX tests as part of your Appveyor build on Windows take the following\nsteps:\n\n1. Ensure that your unit tests are triggered as part of your build script. This\n   is usually the default case when using Maven or Gradle.\n2. If you wish to test in a headless environment your must add [Monocle](https://github.com/TestFX/Monocle)\n    as a test dependency:\n\n    `build.gradle`\n    ```gradle\n    dependencies {\n        testCompile \"org.testfx:openjfx-monocle:8u76-b04\" // jdk-9+181 for Java 9\n    }\n    ```\n\n    `pom.xml`\n    ```xml\n    \u003cdependency\u003e\n        \u003cgroupId\u003eorg.testfx\u003c/groupId\u003e\n        \u003cartifactId\u003eopenjfx-monocle\u003c/artifactId\u003e\n        \u003cversion\u003e8u76-b04\u003c/version\u003e \u003c!-- jdk-9+181 for Java 9 --\u003e\n        \u003cscope\u003etest\u003c/scope\u003e\n    \u003c/dependency\u003e\n    ```\n3. Base your Appveyor configuration on the following. Some different build variations are shown (Glass/AWT robot,\n    Headed/Headless, (Hi)DPI, etc.) adjust the build matrix to your requirements.\n\n    `appveyor.yml`\n    ```yaml\n    version: \"{branch} {build}\"\n    environment:\n      matrix:\n        # Java 8 / AWT Robot\n        - JAVA_VERSION: \"8\"\n          JAVA_HOME: C:\\Program Files\\Java\\jdk1.8.0\n          _JAVA_OPTIONS: \"-Dtestfx.robot=awt -Dtestfx.awt.scale=true\"\n        # Java 8 / AWT Robot / HiDPI\n        - JAVA_VERSION: \"8\"\n          JAVA_HOME: C:\\Program Files\\Java\\jdk1.8.0\n          _JAVA_OPTIONS: \"-Dtestfx.robot=awt -Dtestfx.awt.scale=true -Dglass.win.uiScale=200%\"\n        # Java 8 / Headless\n        - JAVA_VERSION: \"8\"\n          JAVA_HOME: C:\\Program Files\\Java\\jdk1.8.0\n          _JAVA_OPTIONS: \"-Djava.awt.headless=true -Dtestfx.robot=glass -Dtestfx.headless=true -Dprism.order=sw -Dprism.text=t2k\"\n        # Java 10 / AWT Robot / HiDPI\n        - JAVA_VERSION: \"10\"\n          JAVA_HOME: C:\\jdk10\n          _JAVA_OPTIONS: \"-Dtestfx.robot=awt -Dtestfx.awt.scale=true -Dglass.win.uiScale=200%\"\n        # Java 11 / AWT Robot / HiDPI\n        - JAVA_VERSION: \"11\"\n          JAVA_HOME: C:\\jdk11\n          _JAVA_OPTIONS: \"-Dtestfx.robot=awt -Dtestfx.awt.scale=true -Dglass.win.uiScale=200%\"\n\n    build_script:\n      - ps: |\n          if ($env:JAVA_VERSION -eq \"11\") {\n            $client = New-Object net.webclient\n            $client.DownloadFile('http://jdk.java.net/11/', 'C:\\Users\\appveyor\\openjdk11.html')\n            $openJdk11 = cat C:\\Users\\appveyor\\openjdk11.html | where { $_ -match \"href.*https://download.java.net.*jdk11.*windows-x64.*zip\\`\"\" } | %{ $_ -replace \"^.*https:\", \"https:\" } | %{ $_ -replace \".zip\\`\".*$\", \".zip\" }\n            echo \"Download boot JDK from: $openJdk11\"\n            $client.DownloadFile($openJdk11, 'C:\\Users\\appveyor\\openjdk11.zip')\n            Expand-Archive -Path 'C:\\Users\\appveyor\\openjdk11.zip' -DestinationPath 'C:\\Users\\appveyor\\openjdk11'\n            Copy-Item -Path 'C:\\Users\\appveyor\\openjdk11\\*\\' -Destination 'C:\\jdk11' -Recurse -Force\n          }\n          elseif ($env:JAVA_VERSION -eq \"10\") {\n            choco install jdk10 --version 10.0.2 --force --cache 'C:\\ProgramData\\chocolatey\\cache' -params 'installdir=c:\\\\jdk10'\n          }\n\n          // Note: Currently Java 8 is the default JDK, if that changes the above will have to change accordingly.\n\n    shallow_clone: true\n\n    build:\n      verbosity: detailed\n\n    test_script:\n      - gradlew build --no-daemon\n\n    cache:\n      - C:\\Users\\appveyor\\.gradle\\caches\n      - C:\\Users\\appveyor\\.gradle\\wrapper -\u003e .gradle-wrapper\\gradle-wrapper.properties\n      - C:\\ProgramData\\chocolatey\\bin -\u003e appveyor.yml\n      - C:\\ProgramData\\chocolatey\\lib -\u003e appveyor.yml\n      - C:\\ProgramData\\chocolatey\\cache -\u003e appveyor.yml\n    ```\n\n## Chat\n\nHead over to our [gitter chat](https://gitter.im/TestFX/TestFX) for discussion and questions.\n\n## TestFX Legacy: Deprecated\n\nThe `testfx-legacy` subproject is deprecated and no longer supported. It is highly recommended\nthat you switch from using `testfx-legacy`. If you want to continue using it you should cap\nthe versions of `testfx-core` and `testfx-legacy` to `4.0.8-alpha`, which was the last released\nversion of `testfx-legacy`. Using a newer version of `testfx-core` with an older version of\n`testfx-legacy` will very likely break (and does with `testfx-core` versions past `4.0.10-alpha`).\n\n## Credits\n\nThanks to all of the [contributors of TestFX](https://github.com/TestFX/TestFX/graphs/contributors)!\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftestfx%2Ftestfx","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftestfx%2Ftestfx","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftestfx%2Ftestfx/lists"}