Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 实现CI测试以检查函数参数是否有效的方法?_Python_Django_Travis Ci_Codeql_Semmle Ql - Fatal编程技术网

Python 实现CI测试以检查函数参数是否有效的方法?

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&

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

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中预先存在的)参数的函数调用。