Python 实现CI测试以检查函数参数是否有效的方法?
假设我有一个python函数和字典,如下所示:Python 实现CI测试以检查函数参数是否有效的方法?,python,django,travis-ci,codeql,semmle-ql,Python,Django,Travis Ci,Codeql,Semmle Ql,假设我有一个python函数和字典,如下所示: d = {"a": 1, "b": 2, "c": 3} def foo(input): return d[input] 当我将代码推送到GitHub(可能是通过某种持续集成)时,是否有办法检查foo的所有调用是否只使用d的一个键作为输入参数,如果有一个调用带有无效参数,则标记它或发出警报 例如: foo("a") # no flag foo("d&
d = {"a": 1, "b": 2, "c": 3}
def foo(input):
return d[input]
当我将代码推送到GitHub(可能是通过某种持续集成)时,是否有办法检查foo
的所有调用是否只使用d
的一个键作为输入
参数,如果有一个调用带有无效参数,则标记它或发出警报
例如:
foo("a") # no flag
foo("d") # flag/alert
我知道如何在运行时引发异常或
ValueError
,但我正在寻找一个CI解决方案,以包含在我们的GitHub工作流中。现在我们正在使用Travis CI进行定制测试和LGTM提供的标准CodeQL测试。我研究过通过LGTM使用定制的CodeQL,但我不太明白。我可以在这些连续集成或第三个集成中实现它。我们在您的wrkDir中,pythonFunction.py在其中,foo(输入),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"
听起来你需要一个合适的函数参数注释和一个检查程序。嗯……我不知道你可以在类型之外做参数注释?尤其是在Python2.7中?无论如何,您不应该使用Python2.7,因为它已经下线9个月了。但是,是的,有一个类型化dict的PEP:如果我错了,请纠正我,但这不是描述为字典的键和值而不是函数的参数设置注释的PEP吗?嗯……进一步搜索后,也许可以使用文本类型注释?除了你不能做文字[dict.keys()]…你。。。这里主要描述单元测试。如果OP已经使用了Travis,他们可能知道什么是测试。“要包含在我们GitHub工作流中的CI解决方案”-这就是它所描述的,不是吗?我们的函数中已经有代码,如果在运行时抛出“无效”参数(我在上面的示例中排除了该参数)调用函数,就会发出警告。这个单元测试肯定是一种有效的方法来检查它是否有效。我要寻找的是一种主动检测代码的方法(在代码到达django服务器之前),该代码被写入并推送到GitHub,使用新的/无效的参数,而不将该参数作为键:值对包含在字典中。如果不知道dict.keys(),如何定义无效参数?我不想(在本例中)在调用函数时检查参数是否无效。我想检查函数调用在写入并推送到GitHub时是否无效(因此在本例中,与lgtm/codeql检查相比,与travis单元测试更相似)。基本上,我想确保有人已经向dict添加了一个对应的项,如果他们随后添加了一个带有新(不是dict中预先存在的)参数的函数调用。