5

我的设置

我正在使用 Python 中的 pytest 和 ctypes 测试 C 库中的函数。C 库中的每个函数调用嵌入式 linux PCI 板上的一个函数,然后 C 库函数返回一个整数,该整数映射到一组返回码。如果函数成功,则返回 0,否则返回其他错误代码。

问题

我正在寻找有关测试此设置的最佳方法的一些见解,基本上我正在尝试找出测试此库的最佳实践。抛出异常和断言测试用例的最佳方式。我目前使用的测试环境使用的是pytest,切换起来会很痛苦。

由于嵌入式 linux 板具有状态,因此需要为测试设置很多状态以测试所有不同的条件。因此,理想情况下,如果出现错误,python 将捕获测试中发生的所有错误。

我当前的设置

目前我有包装 C 库代码的 python 函数。测试将调用 python 代码,如果函数不返回 0,则包装 python 函数将引发异常。因为我使用 ctypes 来调用 DLL 上的函数,所以无论如何,所有 C 函数都由 python 包装,以使它们更易于调用,因此传递参数更容易。

优点

  • 如果测试或任何中间测试的设置出现问题,则会引发异常。当测试用例设置失败时,这使得调试失败的测试用例变得更加容易。

缺点

  • 断言函数成功(返回 0)是没有用的,因为在函数返回之前会抛出错误。
  • 如果您正在测试在某些条件下调用函数会导致错误,则必须包装测试用例混乱的 try-except 块

    try:
       return_code = call_to_c_api()
       assert return_code == 0, "Message about test case"
    except MyCustomException:
       assert MyCustomException.message="Return code of python wrapped api"
    

另外的选择

不要用 python 库包装 C 库,如果其中一个设置函数不起作用,则不要通过测试断言失败。

优点

  • 当您期望发生故障时,很容易断言来自 C API 的返回值不是 O

缺点

  • 为了使测试易于调试,对 C API 的每次调用都需要 Python 测试中的代码以确保它通过。即使它只是一个测试设置的调用。这意味着每次测试的代码行数几乎翻了一番。(或者您无法在设置中捕获错误,并且仅在测试失败时断言。这意味着当测试用例的设置失败时进行痛苦的调试)

如果有人可以对测试它的最佳方法提供任何见解,将不胜感激!可能还有其他我尚未考虑的测试方法!

干杯!

4

0 回答 0