Преглед на файлове

test(e2e): screenshot when assert err

rcmerci преди 6 месеца
родител
ревизия
aea2dd00a0
променени са 4 файла, в които са добавени 72 реда и са изтрити 13 реда
  1. 8 0
      .github/workflows/clj-e2e.yml
  2. 8 0
      clj-e2e/dev/user.clj
  3. 40 0
      clj-e2e/test/logseq/e2e/custom_report.clj
  4. 16 13
      clj-e2e/test/logseq/e2e/fixtures.clj

+ 8 - 0
.github/workflows/clj-e2e.yml

@@ -86,3 +86,11 @@ jobs:
         run: cd clj-e2e && bb dev
         env:
           DEBUG: "pw:api"
+          
+      - name: Collect screenshots
+        if: ${{ failure() }}
+        uses: actions/upload-artifact@v4
+        with:
+          name: e2e-screenshots
+          path: e2e-dump/*
+          retention-days: 1

+ 8 - 0
clj-e2e/dev/user.clj

@@ -18,6 +18,7 @@
 (reset! config/*port 3001)
 ;; show ui
 (reset! config/*headless false)
+(reset! config/*slow-mo 100)
 
 (def *futures (atom {}))
 
@@ -46,6 +47,13 @@
   (->> (future (run-tests 'logseq.e2e.multi-tabs-test))
        (swap! *futures assoc :multi-tabs-test)))
 
+(defn run-all-test
+  []
+  (run-tests 'logseq.e2e.commands-test
+             'logseq.e2e.multi-tabs-test
+             'logseq.e2e.outliner-test
+             'logseq.e2e.rtc-basic-test))
+
 (comment
 
   (future

+ 40 - 0
clj-e2e/test/logseq/e2e/custom_report.clj

@@ -0,0 +1,40 @@
+(ns logseq.e2e.custom-report
+  (:require [clojure.stacktrace :as stack]
+            [clojure.string :as string]
+            [clojure.test :as t]
+            [logseq.e2e.playwright-page :as pw-page])
+  (:import (com.microsoft.playwright Page$ScreenshotOptions)))
+
+(def ^:dynamic *pw-contexts*
+  "Set of pw-contexts.
+  record all playwright contexts in this dynamic var"
+  nil)
+
+(defn- screenshot
+  [page test-name]
+  (println :screenshot test-name)
+  (.screenshot
+   page
+   (-> (Page$ScreenshotOptions.)
+       (.setPath (java.nio.file.Paths/get "e2e-dump/"
+                                          (into-array [(format "./screenshot-%s-%s.png" test-name (System/currentTimeMillis))]))))))
+
+(defmethod t/report :error
+  [m]
+  ;; copy from default impl
+  (t/with-test-out
+    (t/inc-report-counter :error)
+    (println "\nERROR in" (t/testing-vars-str m))
+    (when (seq t/*testing-contexts*) (println (t/testing-contexts-str)))
+    (when-let [message (:message m)] (println message))
+    (println "expected:" (pr-str (:expected m)))
+    (print "  actual: ")
+    (let [actual (:actual m)]
+      (if (instance? Throwable actual)
+        (stack/print-cause-trace actual t/*stack-trace-depth*)
+        (prn actual))))
+
+  ;; screenshot for all pw pages when :error
+  (when-let [all-contexts (seq *pw-contexts*)]
+    (doseq [page (mapcat pw-page/get-pages all-contexts)]
+      (screenshot page (string/join "-" (map (comp str :name meta) t/*testing-vars*))))))

+ 16 - 13
clj-e2e/test/logseq/e2e/fixtures.clj

@@ -1,9 +1,8 @@
 (ns logseq.e2e.fixtures
   (:require [logseq.e2e.config :as config]
-            [logseq.e2e.playwright-page :as pw-page]
-            [logseq.e2e.util :as util]
-            [wally.main :as w]
-            [logseq.e2e.page :as page]))
+            [logseq.e2e.custom-report :as custom-report]
+            [logseq.e2e.page :as page]
+            [wally.main :as w]))
 
 ;; TODO: save trace
 ;; TODO: parallel support
@@ -13,8 +12,9 @@
     (w/make-page {:headless (or headless @config/*headless)
                   :persistent false
                   :slow-mo @config/*slow-mo})
-    (w/navigate (str "http://localhost:" (or port @config/*port)))
-    (f)))
+    (binding [custom-report/*pw-contexts* #{(.context (w/get-page))}]
+      (w/navigate (str "http://localhost:" (or port @config/*port)))
+      (f))))
 
 (def *page1 (atom nil))
 (def *page2 (atom nil))
@@ -29,15 +29,17 @@
         p1 (w/make-page page-opts)
         p2 (w/make-page page-opts)
         port' (or port @config/*port)]
-    (run!
-     #(w/with-page %
-        (w/navigate (str "http://localhost:" port')))
-     [p1 p2])
-
     (reset! *page1 p1)
     (reset! *page2 p2)
-    (binding [w/*page* (delay (throw (ex-info "Don't use *page*, use *page1* and *page2* instead" {})))]
+    (binding [custom-report/*pw-contexts* (set [(.context @p1) (.context @p2)])
+              w/*page* (delay (throw (ex-info "Don't use *page*, use *page1* and *page2* instead" {})))]
+      (run!
+       #(w/with-page %
+          (w/navigate (str "http://localhost:" port')))
+       [p1 p2])
       (f))
+
+    ;; use with-page-open to release resources
     (w/with-page-open p1)
     (w/with-page-open p2)))
 
@@ -53,7 +55,8 @@
     ;; context for p is no longer needed
     (.close (.context p))
     (w/with-page-open p)              ; use with-page-open to close playwright instance
-    (binding [*pw-ctx* ctx]
+    (binding [custom-report/*pw-contexts* #{ctx}
+              *pw-ctx* ctx]
       (f)
       (.close (.browser *pw-ctx*)))))