我想测试一个递归函数然后模拟相同的函数.对于第一个调用,我想实际调用我的模块中出现的函数.当它自己调用时,我想使用mock来模拟调用,并指定第二个递归调用的返回值.
我的意思是一个非常简单的例子:
def some_function(input_value):
if input_value == some_appropriate_value:
return foo
else:
return some_function(some_other_value)
Run Code Online (Sandbox Code Playgroud)
some_function第二次调用它时如何模拟?如果我使用类似@ mock.patch装饰器的东西,我实际上无法测试它,因为some_function 将被模拟为所有调用.
有关如何做到这一点的任何建议?我找不到任何明显的Stack Overflow问题来讨论这个问题.
对于具有密切相关的形式参数的函数,例如
def add_two_numbers(n1, n2):
return n1 + n2
def multiply_two_numbers(n1, n2):
return n1 * n2
Run Code Online (Sandbox Code Playgroud)
如上所示,给两个函数中的参数赋予相同的名称是一个好主意吗?
另一种方法是重命名其中一个函数中的参数.例如:
def add_two_numbers(num1, num2):
return num1 + num2
Run Code Online (Sandbox Code Playgroud)
在两个函数中保持相同看起来更加一致,因为每个函数所采用的参数都是类似的,但更令人困惑的是?
同样,对于下面的例子哪个更好?
def count(steps1, steps2):
a = 0
b = 0
for i in range(steps1):
a += 1
for j in range(steps2):
b += 1
return a, b
def do_a_count(steps1, steps2):
print "Counting first and second steps..."
print count(steps1, steps2)
Run Code Online (Sandbox Code Playgroud)
否则,更改第二个函数中的参数会给出:
def do_a_count(s1, s2):
print "Counting first and second steps..."
print count(s1, s2)
Run Code Online (Sandbox Code Playgroud)
再说一遍,我不确定哪种方式最好.保持相同的参数名称使两个函数之间的关系更清晰,而第二个意味着不可能在两个函数中混淆参数.
我做了一些搜索(包括浏览PEP-8),但找不到明确的答案.(我发现的类似问题包括: python函数中的可选参数的命名练习 …
我刚开始学习测试,所以我刚开始尝试使用py.test组合并运行一些非常简单的单元测试.
示例test_script.py:
import pytest
def test_func():
assert True
pytest.main('-v')
Run Code Online (Sandbox Code Playgroud)
运行这个给出:
============================= test session starts ==============================
platform win32 -- Python 3.3.1 -- pytest-2.3.4 -- C:\Program Files (x86)\Python33\python.exe
collecting ... collected 1 items
test_script.py:3: test_func PASSED
=========================== 1 passed in 0.12 seconds ===========================
Run Code Online (Sandbox Code Playgroud)
如果我更换-v与-s查看标准输出(和禁用标准输出的pytest捕获),测试运行两次:
============================= test session starts ==============================
platform win32 -- Python 3.3.1 -- pytest-2.3.4
============================= test session starts ==============================
platform win32 -- Python 3.3.1 -- pytest-2.3.4
collected 1 items
test_script.py .
=========================== 1 passed …Run Code Online (Sandbox Code Playgroud)