Index: /trunk/appveyor.yml
===================================================================
--- /trunk/appveyor.yml	(revision 14178)
+++ /trunk/appveyor.yml	(revision 14179)
@@ -15,4 +15,7 @@
             $wc.UploadFile("https://ci.appveyor.com/api/testresults/junit/$($env:APPVEYOR_JOB_ID)", (Resolve-Path $_))
         }
+  # we want to push test result artifact even if the tests fail, so uploading manually
+  - 7z a test-results.zip test\report\TEST*.xml
+  - ps: Push-AppveyorArtifact test-results.zip
 artifacts:
   - path: dist\josm-custom.*
@@ -20,5 +23,3 @@
   - path: pmd-josm.xml
   - path: spotbugs-josm.xml
-  - path: test\report
-    type: zip
   - path: hs_err_pid*.log
Index: /trunk/test/unit/org/openstreetmap/josm/testutils/PluginServer.java
===================================================================
--- /trunk/test/unit/org/openstreetmap/josm/testutils/PluginServer.java	(revision 14178)
+++ /trunk/test/unit/org/openstreetmap/josm/testutils/PluginServer.java	(revision 14179)
@@ -26,4 +26,5 @@
 import com.github.tomakehurst.wiremock.junit.WireMockRule;
 import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Streams;
 
 public class PluginServer {
@@ -118,5 +119,6 @@
 
                 if (jarPath.startsWith(filesRootPath)) {
-                    return filesRootPath.relativize(jarPath).toString();
+                    // would just use .toString() but need to force use of *forward slash* path separators on all platforms
+                    return Streams.stream(filesRootPath.relativize(jarPath)).map(p -> p.toString()).collect(Collectors.joining("/"));
                 }
             }
