А чем можно тестировать генерированные отчеты в pdf? Есть какие-то инструменты,или писать свой велосипед, который парсит, сравнивает...
Сравнивать хеш не предлагать :)
Отчеты генерирует BIRТ, и сохраняются селениумом. Управляется все Хатсоном.
А чем можно тестировать генерированные отчеты в pdf? Есть какие-то инструменты,или писать свой велосипед, который парсит, сравнивает...
Сравнивать хеш не предлагать :)
Отчеты генерирует BIRТ, и сохраняются селениумом. Управляется все Хатсоном.
Можно попробоват несколько способов описанных вот тут http://stackoverflow.com/questions/145657/how-to-compare-two-pdf-files
Подобных решений не надоходил, приходилось решать все программный способом.
Например, на python можно использовать pyPDF
{syntaxhighlighter brush: bash;fontsize: 100; first-line: 1; }import pyPdf
class PDFLibrary:
“”" PDF library description “”"
ROBOT_TESTING_SCOPE = ‘GLOBAL’
pdf = ‘’
def __init__(self, path='d:\\LorstemMasterInvoice.pdf'):
self.pdf = pyPdf.PdfFileReader(file(path, "rb"))
def get_text(self, page):
""" get_text description is here """
return self.pdf.getPage(int(page)).extractText() + " "
def check_text_contains(self, text_to_check):
""" check_text_contains description is here """
print self.get_text(0).find(text_to_check)
if self.get_text(0).find(text_to_check) == -1:
return False
else:
return True
def get_keyword_names(self):
return ['get_text','check_text_contains']{/syntaxhighlighter}</p><p>также можно посмотреть реализацию на Ruby <a href="http://agilesoftwaretesting.com/?p=166">http://agilesoftwaretesting.com/?p=166</a></p><p> </p>
да кстати, для робот фреймворка люди написали тоже библиотеку. я думаю код можно переиспользовать в связке в селениум. https://code.google.com/p/robotframework-pdflibrary/source/browse/src/main/java/de/codecentric/robot/pdf/PDFKeywords.java
{syntaxhighlighter brush: java;fontsize: 100; first-line: 1; }/* * Copyright 2010 codecentric AG * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */
package de.codecentric.robot.pdf;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang.StringUtils;
import org.robotframework.javalib.annotation.RobotKeyword;
import org.robotframework.javalib.annotation.RobotKeywords;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.parser.PdfTextExtractor;
@RobotKeywords
public class PDFKeywords {
? public static final String ROBOT_LIBRARY_SCOPE = “GLOBAL”;
? private PdfReader reader;
? private Map<Integer, String> pdfData;
? @RobotKeyword
? public void parsePdf(String filename) throws IOException {
? ? reader = new PdfReader(filename);
? ? System.out.println("Reading file "+filename);
? ? pdfData = new HashMap<Integer, String>();
? ? int numberOfPages = reader.getNumberOfPages();
? ? for (int page = 1; page <= numberOfPages; page++) {
? ? ? System.out.println("Reading page "+page);
? ? ? String textFromPage = PdfTextExtractor
? ? ? ? ? .getTextFromPage(reader, page);
? ? ? pdfData.put(page, textFromPage);
? ? }
? }
? @RobotKeyword
? public void pdfShouldContain(String expectedValue) {
? ? Collection<String> values = pdfData.values();
? ? collectionShouldContain(expectedValue, values);
? }
? @RobotKeyword
? public void pdfShouldContain(String expectedValue, String ignoreLinebreaks) {
? ? if (StringUtils.isEmpty(ignoreLinebreaks)) pdfShouldContain(expectedValue);
? ? Collection<String> values = pdfData.values();
? ? values = removeLinebreaks(values);
? ? collectionShouldContain(expectedValue, values);
? }
? @RobotKeyword
? public void pdfShouldContain(String expectedValue, String ignoreLinebreaks, String ignoreCase) {
? ? if (StringUtils.isEmpty(ignoreCase)) pdfShouldContain(expectedValue, ignoreLinebreaks);
? ? Collection<String> values = pdfData.values();
? ? values = removeLinebreaks(values);
? ? collectionShouldContain(expectedValue, values, StringUtils.isNotEmpty(ignoreCase));
? }
?
? private void collectionShouldContain(String expectedValue, Collection<String> values) {
? ? collectionShouldContain(expectedValue, values, false);
? }
?
? private void collectionShouldContain(String expectedValue, Collection<String> values, boolean ignoreCase) {
? ? for (String content : values) {
? ? ? if (ignoreCase?StringUtils.containsIgnoreCase(content, expectedValue):StringUtils.contains(content, expectedValue)) {
? ? ? ? return;
? ? ? }
? ? }
? ? throw new RuntimeException("could not find " + expectedValue + " in "
? ? ? ? + pdfData);
? }
? protected Collection<String> removeLinebreaks(Collection<String> values) {
? ? List<String> contentWithoutLinebreacks = new ArrayList<String>();
? ? for (String string : values) {
? ? ? String reformattedString = string.replaceAll(“\n”, " “);
? ? ? while (reformattedString.contains(” “)) {
? ? ? ? reformattedString = reformattedString.replaceAll(” ", " ");
? ? ? }
? ? ? contentWithoutLinebreacks.add(reformattedString);
? ? }
? ? values = contentWithoutLinebreacks;
? ? return values;
? }
}
{/syntaxhighlighter}
и его использование https://code.google.com/p/robotframework-pdflibrary/source/browse/src/test/java/de/codecentric/robot/pdf/PDFKeywordsTest.java
{syntaxhighlighter brush: java;fontsize: 100; first-line: 1; }/*
package de.codecentric.robot.pdf;
import static org.junit.Assert.assertTrue;
import java.io.IOException;
import java.util.Arrays;
import java.util.Collection;
import org.junit.Before;
import org.junit.Test;
public class PDFKeywordsTest {
private PDFKeywords pdfLibrary;
final static String SUCCESS_STORY_PDF = "effektive-neukundengewinnung.pdf";
final static String ARTICLE_PDF = "business-case-fuer-agilitaet.pdf";
final static String FIELD_GEBURTSNAME = "profil_geburtsdatum";
final static String TITLE = "SUCCESS STORY";
@Before
public void setup() {
pdfLibrary = new PDFKeywords();
}
@Test
public void shouldParseField() throws IOException {
pdfLibrary.parsePdf(SUCCESS_STORY_PDF);
pdfLibrary.pdfShouldContain(TITLE);
}
@Test(expected=IOException.class)
public void shouldFailOnNoFile() throws IOException {
pdfLibrary.parsePdf(SUCCESS_STORY_PDF+"XXX");
}
@Test(expected=Throwable.class)
public void shouldFailOnUnknownText() throws IOException {
pdfLibrary.parsePdf(SUCCESS_STORY_PDF);
pdfLibrary.pdfShouldContain(TITLE+"XXX");
}
@Test
public void shouldFindWrappedLines() throws IOException {
pdfLibrary.parsePdf(SUCCESS_STORY_PDF);
pdfLibrary.pdfShouldContain("Ziel ist, innerhalb von 3 Jahren jeden Monat mehr als 100.000 "+
"neue Adressen und ?ber 10.000 neue Kunden zu gewinnen.", "ignore linebreaks");
}
@Test
public void shouldFindWrappedHeaders() throws IOException {
pdfLibrary.parsePdf(ARTICLE_PDF);
pdfLibrary.pdfShouldContain("Business Case f?r Agilit?t", "ignore linebreaks");
}
@Test
public void shouldIgnoreCase() throws IOException {
pdfLibrary.parsePdf(ARTICLE_PDF);
pdfLibrary.pdfShouldContain("STUDIEN gehen DAVON aus, DASS fast ZWEI Drittel DER Funk- "+
"tionen in einer Anwendung selten oder ?berhaupt nicht "+
"GENUTZT WERDEN", "ignore linebreaks", "ignore case");
}
@Test
public void shouldNotTouchWhenNoLinebreaks() {
Collection<String> values = Arrays.asList(new String[] {"a", "b", "c"});
values = pdfLibrary.removeLinebreaks(values);
assertTrue(values.contains("a"));
assertTrue(values.contains("b"));
assertTrue(values.contains("c"));
}
@Test
public void shouldRemoveLinebreaks() {
Collection<String> values = Arrays.asList(new String[] {"a\nb", "c\nd"});
values = pdfLibrary.removeLinebreaks(values);
assertTrue(values.contains("a b"));
assertTrue(values.contains("c d"));
}
@Test
public void shouldRemoveDoubleSpaces() {
Collection<String> values = Arrays.asList(new String[] {"a b", "c d", "e\n f", "g \nh"});
values = pdfLibrary.removeLinebreaks(values);
assertTrue(values.contains("a b"));
assertTrue(values.contains("c d"));
assertTrue(values.contains("e f"));
assertTrue(values.contains("g h"));
}
}
{/syntaxhighlighter}
Спасибо, похоже то что надо.
Спасибо, похоже то что надо.
you are welcome, если сделаешь что-то еще понакрученее, делись ;)