【问题标题】:Way to implement CI test to check if function argument is valid?实现 CI 测试以检查函数参数是否有效的方法?
【发布时间】:2020-12-27 09:55:21
【问题描述】:

假设我有一个 python 函数和字典如下:

d = {"a": 1, "b": 2, "c": 3}
def foo(input):
    return d[input]

当我将我的代码推送到 GitHub(可能是某种持续集成)时,有没有办法检查 foo 的所有调用是否仅使用 d 的一个键作为 input 参数,并且如果有一个带有无效参数的调用,标记它或发出警报?

例如:

foo("a") # no flag
foo("d") # flag/alert

我知道如何在运行时引发异常或ValueError,但我正在寻找一个 CI 解决方案以包含在我们的 GitHub 工作流程中。现在我们正在使用 Travis-CI 进行自定义测试和 LGTM 提供的标准 CodeQL 测试。我研究过通过 LGTM 使用自定义 CodeQL,但我不太明白。我会很好地在这些持续集成中实现它或实现第三个。

【问题讨论】:

  • 听起来您需要适当的函数参数注释和检查器。
  • 嗯...我不知道你可以做超出类型的参数注释?特别是在 python 2.7 中?
  • 好吧,无论如何你都不应该使用 Python 2.7,因为它已经停产 9 个月了。但是,是的,有一个用于输入字典的 PEP:python.org/dev/peps/pep-0589
  • 如果我错了,请纠正我,但是 PEP 不是描述为字典的键和值设置注释,而不是为函数的参数设置注释吗?
  • 嗯...在进一步搜索后,也许 Literal 类型注释会起作用?除了你不能做 Literal[dict.keys()]...

标签: python django travis-ci codeql semmle-ql


【解决方案1】:

我们在您的 wrkDir 中,您的 pythonFunction.py 所在的位置,您的 foo(input), d dict 所在的位置。在那个 wrkDir 中创建文件 tests.py:

import unittest

class TestPythonFunction(unittest.TestCase):
    # define here all required cases
    ALL_DICT_REQUIREMENTS_ =(
        ('a', 1), 
        ('b', 2), 
        ('c', 3)
    )

    
    def test_dictFoo(self):
        # pythonFunction reflects to your pythonFunction.py
        from pythonFunction import foo
        # test all required patterns
        for pattern in TestPythonFunction.ALL_DICT_REQUIREMENTS_:
            key = pattern[0]
            value = pattern[1]
            self.assertIs(foo(key), value)
        # test function is raising error if key doesn't exists
        with self.assertRaises((KeyError)):
            foo('nonsenseKey')
    

if __name__ == '__main__':
    unittest.main()
    

在 wrkDir 中运行

python tests.py

扩展输出:

.
----------------------------------------------------------------------
Ran 1 test in 0.000s

OK

tests.py 退出代码为 0(所有测试都成功),或者如果某些测试失败则没有 0,因此您可以相应地控制您的 CI 任务,

python tests.py && git push || echo "Bad, check tests for error"

【讨论】:

  • 你……基本上是在这里描述单元测试。如果 OP 已经使用 Travis,他们可能知道什么是测试。
  • 'CI 解决方案要包含在我们的 GitHub 工作流程中' - 这就是它所描述的,不是吗?
  • 我们的函数中已经有代码,如果使用“无效”参数调用函数(我在上面的示例中排除了该参数),它会在运行时引发警告。这个单元测试肯定是检查它是否有效的有效方法。我正在寻找的是一种主动检测代码(在它到达我们的 django 服务器之前)的方法,该代码使用新的/无效参数而不包括字典中的参数作为键:值对编写并推送到 GitHub。
  • 如果你不知道你的dict.keys(),你如何定义无效参数?
  • 我不想(在这种情况下)在调用函数时检查参数是否无效。我想检查函数调用在编写并推送到 GitHub 时是否无效(因此在这种情况下,它更类似于 lgtm/codeql 检查而不是 travis 单元测试)。基本上,我想确保有人在 dict 中添加了相应的项目,如果他们随后添加了一个带有新的(不是预先存在于 dict 中的)参数的函数调用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-05
  • 2012-10-22
  • 1970-01-01
  • 2019-08-20
  • 1970-01-01
  • 1970-01-01
  • 2014-07-05
相关资源
最近更新 更多