【问题标题】:Writing a unit test for a function that verifies if a file is pdf or not?为验证文件是否为pdf的函数编写单元测试?
【发布时间】:2020-05-08 18:38:22
【问题描述】:

我正在为我的项目编写单元测试用例,并且对此相对较新。我有一个检查给定文件是否为 PDF 的函数(下面的函数):

def file_verify(orig_pdf):
     try:
         read_pdf = PyPDF2.PdfFileRead(open(orig_pdf,'rb'))
     except PyPDF2.utils.PdfReadError:
         return orig_pdf, "error: Invalid PDF is not supported!"
     else:
         return orig_pdf, os.path.basename(orig_pdf) + "is of PDF file format"

现在我将如何在 python 中为这个函数编写单元测试以确保它正常工作?

编辑:到目前为止,我能够编写单元测试功能(基于我在网上收到的信息),如下所示:

testdata_filename = 'my pdf location'

class TestVerifyPDF(unittest.TestCase):

   def setUp(self):
       self.testfile = open(testdata_filename)
       self.testfile = self.testfile.read()

   def tearDown(self):
       self.testfile.close()

   def test_pdf(self):
       <test here>

【问题讨论】:

  • 我首先将文件处理从验证功能中分离出来,这样您就可以传递测试选择的内容,从而将测试与任何文件系统内容很好地分开。
  • 如果我理解正确,我想您是说要拆分输出并将 orig_pdf 与消息提示分开?好的,但是单元测试用例会是什么样子呢?我认为我也不应该在我的单元测试用例脚本中再次使用 PyPDF2。不确定如何设置单元箱。我已经编辑了我的帖子以反映我迄今为止编写的单元测试
  • 为什么要返回调用者已有的文件名?其他字符串是TrueFalse 的任意替代,这是该函数应该返回的内容。

标签: python unit-testing


【解决方案1】:

我的建议是用集成测试来测试这样一段代码,因为用单元测试来测试它没有太大的价值。您的函数file_verify 主要是与依赖组件的交互。想想你可能想找到什么样的错误:

  • open 调用时参数错误(可能 orig_pdf 不包含有效字符或不是字符串,或者 'rb' 格式不正确或文件模式选择错误)
  • open 以错误的顺序调用参数,缺少参数,通常可能是错误的函数 - 应该是 od.fdopen
  • PyPDF2.PdfFileRead 调用时参数错误,例如可能需要文件名而不是文件
  • PyPDF2.PdfFileRead 抛出与预期不同的异常
  • ...

单元测试无法找到这些错误,因为单元测试的目标是在孤立的代码中找到错误。这意味着,例如,您对open 函数使用测试替身(存根或模拟或类似的东西)而不是真正的open 函数。您替换的 open 函数将用于检查您的测试代码是否根据您(可能是错误的)关于应该如何调用它的假设来调用 open 函数。

为了使示例更具体,如果您的假设是文件模式应该是'rb',则使用替换的open 的测试将检查您是否将'rb' 作为参数传递给open。但是,如果您的假设首先是错误的,那么您的单元测试将无法帮助您检测错误的假设。相反,对真实的open 函数进行测试会告诉您,例如,如果您的模式参数格式错误,而对真实的PyPDF2.PdfFileRead 进行测试可能会显示该函数实际上需要一个可写文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-08-23
    • 1970-01-01
    • 2022-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多