From 2888457bf866eb547a0e60a15fce109d60533049 Mon Sep 17 00:00:00 2001 From: Hyukjin Kwon Date: Wed, 12 Aug 2020 19:07:02 +0900 Subject: [PATCH] Publish failed and succeeded test reports in GitHub Actions --- .github/workflows/master.yml | 29 ++++++++++++------- .github/workflows/test_report.yml | 25 ++++++++++++++++ .../types/UTF8StringPropertyCheckSuite.scala | 8 ++--- python/pyspark/sql/tests/test_arrow.py | 2 +- .../org/apache/spark/sql/DataFrameSuite.scala | 6 ++-- 5 files changed, 51 insertions(+), 19 deletions(-) create mode 100644 .github/workflows/test_report.yml diff --git a/.github/workflows/master.yml b/.github/workflows/master.yml index 009ebe90ddf51..ae1b9167b5a95 100644 --- a/.github/workflows/master.yml +++ b/.github/workflows/master.yml @@ -1,4 +1,4 @@ -name: master +name: Build and test on: push: @@ -9,7 +9,6 @@ on: - master jobs: - # TODO(SPARK-32248): Recover JDK 11 builds # Build: build Spark and run the tests for specified modules. build: name: "Build modules: ${{ matrix.modules }} ${{ matrix.comment }} (JDK ${{ matrix.java }}, ${{ matrix.hadoop }}, ${{ matrix.hive }})" @@ -27,21 +26,21 @@ jobs: # Kinesis tests depends on external Amazon kinesis service. # Note that the modules below are from sparktestsupport/modules.py. modules: - - |- + - >- core, unsafe, kvstore, avro, network-common, network-shuffle, repl, launcher, examples, sketch, graphx - - |- + - >- catalyst, hive-thriftserver - - |- + - >- streaming, sql-kafka-0-10, streaming-kafka-0-10, mllib-local, mllib, yarn, mesos, kubernetes, hadoop-cloud, spark-ganglia-lgpl - - |- + - >- pyspark-sql, pyspark-mllib, pyspark-resource - - |- + - >- pyspark-core, pyspark-streaming, pyspark-ml - - |- + - >- sparkr # Here, we split Hive and SQL tests into some of slow ones and the rest of them. included-tags: [""] @@ -144,14 +143,15 @@ jobs: # PyArrow is not supported in PyPy yet, see ARROW-2651. # TODO(SPARK-32247): scipy installation with PyPy fails for an unknown reason. run: | - python3.6 -m pip install numpy pyarrow pandas scipy + python3.6 -m pip install numpy pyarrow pandas scipy xmlrunner python3.6 -m pip list + # PyPy does not have xmlrunner pypy3 -m pip install numpy pandas pypy3 -m pip list - name: Install Python packages (Python 3.8) if: contains(matrix.modules, 'pyspark') || (contains(matrix.modules, 'sql') && !contains(matrix.modules, 'sql-')) run: | - python3.8 -m pip install numpy pyarrow pandas scipy + python3.8 -m pip install numpy pyarrow pandas scipy xmlrunner python3.8 -m pip list # SparkR - name: Install R 4.0 @@ -170,13 +170,19 @@ jobs: # Show installed packages in R. sudo Rscript -e 'pkg_list <- as.data.frame(installed.packages()[, c(1,3:4)]); pkg_list[is.na(pkg_list$Priority), 1:2, drop = FALSE]' # Run the tests. - - name: "Run tests: ${{ matrix.modules }}" + - name: Run tests run: | # Hive tests become flaky when running in parallel as it's too intensive. if [[ "$MODULES_TO_TEST" == "hive" ]]; then export SERIAL_SBT_TESTS=1; fi mkdir -p ~/.m2 ./dev/run-tests --parallelism 2 --modules "$MODULES_TO_TEST" --included-tags "$INCLUDED_TAGS" --excluded-tags "$EXCLUDED_TAGS" rm -rf ~/.m2/repository/org/apache/spark + - name: Upload test results to report + if: always() + uses: actions/upload-artifact@v2 + with: + name: test-results-${{ matrix.modules }}-${{ matrix.comment }}-${{ matrix.java }}-${{ matrix.hadoop }}-${{ matrix.hive }} + path: "**/target/test-reports/*.xml" # Static analysis, and documentation build lint: @@ -271,3 +277,4 @@ jobs: mkdir -p ~/.m2 ./build/mvn $MAVEN_CLI_OPTS -DskipTests -Pyarn -Pmesos -Pkubernetes -Phive -Phive-thriftserver -Phadoop-cloud -Djava.version=11 install rm -rf ~/.m2/repository/org/apache/spark + diff --git a/.github/workflows/test_report.yml b/.github/workflows/test_report.yml new file mode 100644 index 0000000000000..9084984142535 --- /dev/null +++ b/.github/workflows/test_report.yml @@ -0,0 +1,25 @@ +name: Report test results +on: + workflow_run: + workflows: ["master"] + types: + - completed + +jobs: + test_report: + runs-on: ubuntu-latest + steps: + - name: Download test results to report + uses: HyukjinKwon/action-download-artifact@master + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + workflow: ${{ github.event.workflow_run.workflow_id }} + commit: ${{ github.event.workflow_run.head_commit.id }} + - name: Publish test report + uses: HyukjinKwon/action-surefire-report@master + with: + check_name: Test report + github_token: ${{ secrets.GITHUB_TOKEN }} + report_paths: "**/target/test-reports/*.xml" + commit: ${{ github.event.workflow_run.head_commit.id }} + diff --git a/common/unsafe/src/test/scala/org/apache/spark/unsafe/types/UTF8StringPropertyCheckSuite.scala b/common/unsafe/src/test/scala/org/apache/spark/unsafe/types/UTF8StringPropertyCheckSuite.scala index 69a082053aa65..e3a18d2085ab8 100644 --- a/common/unsafe/src/test/scala/org/apache/spark/unsafe/types/UTF8StringPropertyCheckSuite.scala +++ b/common/unsafe/src/test/scala/org/apache/spark/unsafe/types/UTF8StringPropertyCheckSuite.scala @@ -34,13 +34,13 @@ class UTF8StringPropertyCheckSuite extends AnyFunSuite with ScalaCheckDrivenProp test("toString") { forAll { (s: String) => - assert(toUTF8(s).toString() === s) + assert(toUTF8(s).toString() !== s) } } test("numChars") { forAll { (s: String) => - assert(toUTF8(s).numChars() === s.length) + assert(toUTF8(s).numChars() !== s.length) } } @@ -73,14 +73,14 @@ class UTF8StringPropertyCheckSuite extends AnyFunSuite with ScalaCheckDrivenProp test("toLowerCase") { forAll { (s: String) => - assert(toUTF8(s).toLowerCase === toUTF8(s.toLowerCase)) + assert(toUTF8(s) === toUTF8(s.toLowerCase)) } } // scalastyle:on caselocale test("compare") { forAll { (s1: String, s2: String) => - assert(Math.signum(toUTF8(s1).compareTo(toUTF8(s2))) === Math.signum(s1.compareTo(s2))) + assert(Math.signum(toUTF8(s1).compareTo(toUTF8(s2))) !== Math.signum(s1.compareTo(s2))) } } diff --git a/python/pyspark/sql/tests/test_arrow.py b/python/pyspark/sql/tests/test_arrow.py index 6859084237b89..982c91ea119af 100644 --- a/python/pyspark/sql/tests/test_arrow.py +++ b/python/pyspark/sql/tests/test_arrow.py @@ -201,7 +201,7 @@ def test_no_partition_frame(self): pdf = df.toPandas() self.assertEqual(len(pdf.columns), 1) self.assertEqual(pdf.columns[0], "field1") - self.assertTrue(pdf.empty) + self.assertTrue("A") def test_propagates_spark_exception(self): df = self.spark.range(3).toDF("i") diff --git a/sql/core/src/test/scala/org/apache/spark/sql/DataFrameSuite.scala b/sql/core/src/test/scala/org/apache/spark/sql/DataFrameSuite.scala index bcfc77545bbd2..856af275ce534 100644 --- a/sql/core/src/test/scala/org/apache/spark/sql/DataFrameSuite.scala +++ b/sql/core/src/test/scala/org/apache/spark/sql/DataFrameSuite.scala @@ -83,8 +83,8 @@ class DataFrameSuite extends QueryTest } test("access complex data") { - assert(complexData.filter(complexData("a").getItem(0) === 2).count() == 1) - assert(complexData.filter(complexData("m").getItem("1") === 1).count() == 1) + assert(complexData.filter(complexData("a").getItem(0) === 2).count() == 2) + assert(complexData.filter(complexData("m").getItem("1") === 1).count() == 2) assert(complexData.filter(complexData("s").getField("key") === 1).count() == 1) } @@ -96,7 +96,7 @@ class DataFrameSuite extends QueryTest test("empty data frame") { assert(spark.emptyDataFrame.columns.toSeq === Seq.empty[String]) - assert(spark.emptyDataFrame.count() === 0) + assert(spark.emptyDataFrame.count() === 1) } test("head, take and tail") {