Java 通过gradle写入xlsx

Java 通过gradle写入xlsx,java,gradle,apache-poi,xlsx,Java,Gradle,Apache Poi,Xlsx,我正在用selenium编写测试。我编写了一个testrunner,将测试结果写入xlsx文件。 问题是,这只适用于eclipse! 如果我通过'gradle'运行2个或更多的TestClass,那么只有第一个类执行器会纠正testprotocol,在第一个类抛出异常之后,每个类都会遇到异常。结果是,只有第一个测试类结果被写入协议 de.h2o.testing.testprotocol.Screenshot STANDARD_ERROR Jan 14, 2014 9:49:21 AM d

我正在用selenium编写测试。我编写了一个testrunner,将测试结果写入xlsx文件。 问题是,这只适用于eclipse! 如果我通过'gradle'运行2个或更多的TestClass,那么只有第一个类执行器会纠正testprotocol,在第一个类抛出异常之后,每个类都会遇到异常。结果是,只有第一个测试类结果被写入协议

de.h2o.testing.testprotocol.Screenshot STANDARD_ERROR
    Jan 14, 2014 9:49:21 AM de.h2o.testing.testprotocol.TestProtocol writeToFile
    Warnung: error occured while writing protocol file: org.apache.xmlbeans.impl.values.XmlValueDisconnectedException: null
org.apache.xmlbeans.impl.values.XmlValueDisconnectedException
    at org.apache.xmlbeans.impl.values.XmlObjectBase.check_orphaned(XmlObjectBase.java:1247)
    at org.apache.xmlbeans.impl.values.XmlObjectBase.setterHelper(XmlObjectBase.java:1980)
    at org.apache.xmlbeans.impl.values.XmlObjectBase.set(XmlObjectBase.java:2062)
    at org.apache.poi.xssf.usermodel.XSSFRow.createCell(XSSFRow.java:170)
    at org.apache.poi.xssf.usermodel.XSSFRow.createCell(XSSFRow.java:147)
    at org.apache.poi.xssf.usermodel.XSSFRow.createCell(XSSFRow.java:39)
    at de.h2o.testing.testprotocol.TestProtocol.setCellValue(TestProtocol.java:376)
    at de.h2o.testing.testprotocol.TestProtocol.writeTableHead(TestProtocol.java:216)
    at de.h2o.testing.testprotocol.TestProtocol.writeToFile(TestProtocol.java:113)
    at de.h2o.testing.testprotocol.TestProtocol.afterClass(TestProtocol.java:102)
    at de.h2o.testing.testprotocol.H2oTestRunner$1.finishTestRun(H2oTestRunner.java:85)
    at de.h2o.testing.testprotocol.H2oTestRunner$1.countDownTestCounter(H2oTestRunner.java:119)
    at de.h2o.testing.testprotocol.H2oTestRunner$1.testIgnored(H2oTestRunner.java:113)
    at org.junit.runner.notification.RunNotifier$6.notifyListener(RunNotifier.java:175)
    at org.junit.runner.notification.RunNotifier$SafeNotifier.run(RunNotifier.java:61)
    at org.junit.runner.notification.RunNotifier.fireTestIgnored(RunNotifier.java:172)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
    at de.h2o.testing.testBase.CompleteTestWatcher$1.evaluate(CompleteTestWatcher.java:16)
    at org.junit.rules.RunRules.evaluate(RunRules.java:20)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
    at de.h2o.testing.testprotocol.H2oTestRunner.run(H2oTestRunner.java:123)
    at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecuter.runTestClass(JUnitTestClassExecuter.java:80)
    at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecuter.execute(JUnitTestClassExecuter.java:47)
    at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassProcessor.processTestClass(JUnitTestClassProcessor.java:69)
    at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.processTestClass(SuiteTestClassProcessor.java:49)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35)
    at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
    at org.gradle.messaging.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:32)
    at org.gradle.messaging.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:93)
    at com.sun.proxy.$Proxy2.processTestClass(Unknown Source)
    at org.gradle.api.internal.tasks.testing.worker.TestWorker.processTestClass(TestWorker.java:103)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35)
    at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
    at org.gradle.messaging.remote.internal.hub.MessageHub$Handler.run(MessageHub.java:355)
    at org.gradle.internal.concurrent.DefaultExecutorFactory$StoppableExecutorImpl$1.run(DefaultExecutorFactory.java:66)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:724)
问题不在任何testclass或testrunner中,因为在使用.csv文件时一切都正常。现在,换成xlsx后,我不再和gradle一起工作了

希望有人能帮忙

这是代码。它在每个测试类中都被调用。writeHead、writeData方法等正在用数据填充工作表。抛出的异常是方法:setCellValue

private void writeTableHead(Sheet sheet) {

    setCellValue(7, 0, "*******************************");
    // print versionline

    setCellValue(8, 0, "Version");
    int cellCount = 4;
    for (TestRun runTriple : summary.getTestRuns()) {
        setCellValue(8, cellCount, runTriple.version);
        setStyle(8, cellCount, styles.get("borderThin"));
        sheet.setColumnWidth(cellCount, 2500);
        cellCount++;
    }
    setCellValue(9, 0, "Build");
    cellCount = 4;
    for (TestRun runTriple : summary.getTestRuns()) {
        setCellValue(9, cellCount, runTriple.build);
        setStyle(9, cellCount, styles.get("borderThin"));
        cellCount++;
    }
    setCellValue(10, 0, "Package");
    setCellValue(10, 1, "Class");
    setCellValue(10, 2, "Name");
    setCellValue(10, 3, "Type");
    cellCount = 4;
    for (TestRun runTriple : summary.getTestRuns()) {
        setCellValue(10, cellCount, new SimpleDateFormat("dd.MM.yyyy").format(runTriple.date));
        setStyle(10, cellCount, styles.get("date"));
        cellCount++;
    }

}

private void writeHead(Sheet sheet) {
    double totalFailed = summary.getNumberOfFailedTests();
    double totalSkipped = summary.getNumberOfSkippedTests();
    double totalSucceeded = summary.getNumberOfSucceededTests();
    double totalNumberOfTests = summary.getNumberOfTests();
    double succeededPercent = totalSucceeded / totalNumberOfTests;
    double failedPercent = totalFailed / totalNumberOfTests;
    double skippedPercent = totalSkipped / totalNumberOfTests;

    setCellValue(0, 0, "TESTPROTOKOL");

    setCellValue(1, 0, "Archiv");
    setCellValue(1, 1, "Git repository");

    setCellValue(2, 0, "Anzahl Tests");
    setCellValue(2, 1, totalNumberOfTests);

    setCellValue(3, 0, "Erfolgreiche Tests");
    setCellValue(3, 1, totalSucceeded);
    setCellValue(3, 2, succeededPercent);

    setCellValue(4, 0, "Fehlgeschlagene Tests");
    setCellValue(4, 1, totalFailed);
    setCellValue(4, 2, failedPercent);

    setCellValue(5, 0, "Geskippte Tests");
    setCellValue(5, 1, totalSkipped);
    setCellValue(5, 2, skippedPercent);

}

private void setCellValue(int row, int column, String value) {
    Row tmpRow;
    if (sheet.getRow(row) == null) {
        tmpRow = sheet.createRow(row);
    } else {
        tmpRow = sheet.getRow(row);
    }
    tmpRow.createCell(column).setCellValue(value);
}



private void writeToFile() {

    try {

        // Write protocolHEAD
        writeHead(sheet);

        // Write tableHEAD
        writeTableHead(sheet);

        // print data
        writeData(sheet);
        formatSheet(sheet);

        FileOutputStream stream = new FileOutputStream(file);
        wb.write(stream);
        stream.flush();
        stream.close();

        System.out.println("Protocol written to " + file.getAbsolutePath());
    } catch (Exception e) {
        log.warning("error occured while writing protocol file: " + e.getClass().getCanonicalName() + ": " + e.getMessage());
        e.printStackTrace();
    }
}

主要问题是,gradle试图并行执行多个测试。因此,第一个测试开始写入文件,因此其他测试将阻止访问该文件。按顺序运行测试后,一切正常

看起来非常类似于您多次尝试执行写入操作。。。请分享代码…@Nikolay Lagutko:不一样。只有使用gradleTask运行测试时,问题才会出现。如果我手动运行,一切正常。所以我认为主要的问题是:gradleTask和通过eclipse手动运行的gradleTask之间有什么区别。