【问题标题】:How can I unittest whether PDF files have been generated correctly?如何对 PDF 文件是否已正确生成进行单元测试?
【发布时间】:2016-07-20 13:38:06
【问题描述】:

我编写了一个使用 matplotlib 和 seaborn 绘制图表的小型 python 库,我想知道如何测试图表是否看起来像我真正想要的那样。

因此,给定一个我声明为正确的参考 pdf 文件,我将如何自动检查它是否等于带有虚拟数据的动态生成文件?

我认为由于时间戳等原因对文件进行哈希处理是不可靠的。

【问题讨论】:

    标签: python unit-testing pdf pytest


    【解决方案1】:

    一些想法:

    • 使用diff-pdf
    • 将其转换为图像(例如使用 ImageMagick)并使用 PerceptualDiff
    • 以某种方式从 PDF 中获取数据(PyPDF2 可能吗?)并进行比较
    • 使用某些东西(PyPDF2?pdftk?)将标头信息(如时间戳)修补到文件相等并比较哈希值的程度

    【讨论】:

    • 截至今天,0 票赞成,0 票反对。当我看到一个没有得到一票的公认答案时,我总是感到惊讶。如果它解决了问题,它也必须是值得投票的
    【解决方案2】:

    为了与回归测试一起使用,我编写了 diffpdf.sh 来执行 PDF 的逐页视觉差异。它利用 ImageMagick 和 Poppler PDF 实用程序 pdftoppmpdfinfo

    diffpdf.sh 将在 PDF 的显示不同时输出非零返回码,并打印不同页面的页码以及反映页面差异程度的数字。每个页面的视觉差异图像也保存到pdfdiff 目录。

    #!/bin/bash
    
    # usage: diffpdf.sh fidle_1.pdf file_2.pdf
    
    # requirements:
    # - ImageMagick
    # - Poppler's pdftoppm and pdfinfo tools (works with 0.18.4 and 0.41.0,
    #                                         fails with 0.42.0)
    
    DIFFDIR="pdfdiff"                        # directory to place diff images in
    MAXPROCS=$(getconf _NPROCESSORS_ONLN)    # number of parallel processes
    
    pdf_file1=$1
    pdf_file2=$2
    
    function diff_page {
        # based on http://stackoverflow.com/a/33673440/438249
        pdf_file1=$1
        pdf_file2=$2
        page_number=$3
        page_index=$(($page_number - 1))
    
        (cat $pdf_file1 | pdftoppm -f $page_number -singlefile -gray - | convert - miff:- ; \
         cat $pdf_file2 | pdftoppm -f $page_number -singlefile -gray - | convert - miff:- ) | \
        convert - \( -clone 0-1 -compose darken -composite \) \
                -channel RGB -combine $DIFFDIR/$page_number.jpg
    
        if (($? > 0)); then
            echo "Problem running pdftoppm or convert!"
            exit 1
        fi
        grayscale=$(convert pdfdiff/$page_number.jpg -colorspace HSL -channel g -separate +channel -format "%[fx:mean]" info:)
        if [ "$grayscale" != "0" ]; then
            echo "page $page_number ($grayscale)"
            return 1
        fi
        return 0
    }
    
    function num_pages {
        pdf_file=$1
    
        pdfinfo $pdf_file | grep "Pages:" | awk '{print $2}'
    }
    
    function minimum {
        echo $(( $1 < $2 ? $1 : $2 ))
    }
    
    # guard agains accidental deletion of files in the root directory
    if [ -z "$DIFFDIR" ]; then
        echo "DIFFDIR needs to be set!"
        exit 1
    fi
    
    echo "Running $MAXPROCS processes in parallel"
    
    pdf1_num_pages=$(num_pages $pdf_file1)
    pdf2_num_pages=$(num_pages $pdf_file2)
    
    min_pages=$(minimum $pdf1_num_pages $pdf2_num_pages)
    
    if [ "$pdf1_num_pages" -ne "$pdf2_num_pages" ]; then
        echo "PDF files have different lengths ($pdf1_num_pages and $pdf2_num_pages)"
        rc=1
    fi
    
    if [ -d "$DIFFDIR" ]; then
        rm -f $DIFFDIR/*
    else
        mkdir $DIFFDIR
    fi
    
    
    # get exit status from subshells (http://stackoverflow.com/a/29535256/438249)
    function wait_for_processes {
        local rc=0
    
        while (( "$#" )); do
            # wait returns the exit status for the process
            if ! wait "$1"; then
                rc=1
            fi
            shift
        done
        return $rc
    }
    
    function howmany() {
        echo $#
    }
    
    rc=0
    pids=""
    for page_number in `seq 1 $min_pages`;
    do
        diff_page $pdf_file1 $pdf_file2 $page_number &
        pids+=" $!"
        if [ $(howmany $pids) -eq "$MAXPROCS" ]; then
            if ! wait_for_processes $pids; then
                rc=1
            fi
            pids=""
        fi
    done
    
    if ! wait_for_processes $pids; then
        rc=1
    fi
    
    exit $rc
    

    编辑:可以在here找到此脚本的改进版本,用 Python 编写。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-06
      • 2013-11-26
      • 2020-12-05
      • 1970-01-01
      • 2023-03-20
      • 2014-02-14
      相关资源
      最近更新 更多