如何从python正确测试C API,C API将返回代码作为错误返回

m3h*_*hes 5 python testing automated-tests ctypes pytest

我的设置

我正在使用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"
    
    Run Code Online (Sandbox Code Playgroud)

另外一个选项

如果其中一个设置函数不起作用,请不要使用python库包装C库并使其进行测试以断言失败.

好处

  • 当您预计发生故障时,很容易断言C API的返回值不是O.

缺点

  • 为了使测试易于调试,每次调用C API都需要在python测试中使用代码以确保它通过.即使只是要求设置测试.这意味着每次测试的代码行数几乎翻倍.(或者你无法在设置中捕获错误,只在测试失败时断言.这意味着当测试用例的安装失败时会进行痛苦的调试)

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

干杯!