java - 通过 gradle 编写 xlsx

标签 java gradle apache-poi xlsx

我用 Selenium 写测试。我编写了一个测试运行程序,将测试结果写入 xlsx 文件。
问题是,这只适用于 eclipse !
如果我通过“gradle”运行 2 个或更多测试类,则只有第一个类执行正确的测试协议(protocol),在第一个类引发异常后,每个类都会发生错误。结果是,只有第一个测试类结果被写入协议(protocol)。

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 试图并行执行多个测试。因此,第一个测试开始写入文件,因此其他测试阻止访问该文件。按顺序运行测试后,一切正常

关于java - 通过 gradle 编写 xlsx,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21109715/

相关文章:

java - NoClassDefFoundError org/apache/poi/ss/usermodel/Workbook

java - 解析xml并制作对象java

java - 为什么我的所有 Spring boot 执行器端点都是公开可用的?

android - Gradle复制任务既不复制文件也不给出任何错误

java - 将 Excel 模板与 Apache POI 结合使用

java - 动态添加外部(跨工作簿)引用

java - Red 5 媒体服务器版本 1.0 查找正确的 Java 版本

java - java中面板中的面板显示

android - 使用 gradle 重命名 apk -> 两次获得相同的 apk

java - IntelliJ 测试失败,Gradle 测试正常 : does not recognize JSON files in 'test/resources'