首先,您需要了解您所处的环境。因此这是您应该测试的功能。但它不是一个真正的函数,其中输入进入输出并在内部进行一些处理:这个函数有一些外部依赖性,这总是令人不安并且使测试更加困难。所以,重构它:
def perform_experiment(maxTries, numberOfResults, some parameters) -> results[obj]:
现在,还有 1 个我们无法控制的依赖项:random_attempt()。这就是为什么你必须嘲笑它的原因。让我们将它移到单独的函数中以增加清晰度并使模拟更容易:
def perform_experiment(maxTries, numberOfResults, some parameters) -> results[obj]:
results = []
for i in range(maxTries):
results.append(getValidRandomAttempt())
if len(results) >= numberOfResults:
break
return results
def getValidRandomAttempt():
result_to_validate = random_attempt()
if valid(result_to_validate):
return result_to_validate
但是等等,我们只想收集有效结果,所以我们必须更改列表名称,当没有进行有效尝试时 None 值也有问题:
def perform_experiment(maxTries, numberOfResults, some parameters) -> validResults[obj]:
validResults = []
for i in range(maxTries):
result = getValidRandomAttempt()
if result != None:
validResults.append(result)
if len(validResults) >= numberOfResults:
break
return validResults
def getValidRandomAttempt():
result_to_validate = random_attempt()
if valid(result_to_validate):
return result_to_validate
在此阶段是最困难的部分,因为您必须了解在给定 maxTries、numberOfResults 和结果列表值组合的情况下对该函数的期望。
这是一个可能过于详细或可能缺少某些方面的示例。此输入模型需要根据您的需要进行调整。反正:
关于maxTries有2种情况:
A. maxTries == 0
B. maxTries > 0
然后,关于 maxTries 与 numberOfResults 的关系,存在 maxTries > 0 的情况:
A. maxTries > numberOfResults
B. maxTries == numberOfResults
C. maxTries < numberOfResults
最后,它们应该与 validResults 案例结合:
0. maxTries == 0
1. maxTries > numberOfResults, len(validResults) == numberOfResults
2. maxTries > numberOfResults, len(validResults) > numberOfResults
3. maxTries > numberOfResults, len(validResults) < numberOfResults
4. maxTries == numberOfResults, len(validResults) == numberOfResults
5. maxTries == numberOfResults, len(validResults) > numberOfResults
6. maxTries == numberOfResults, len(validResults) < numberOfResults
7. maxTries < numberOfResults, len(validResults) == numberOfResults
8. maxTries < numberOfResults, len(validResults) > numberOfResults
9. maxTries < numberOfResults, len(validResults) < numberOfResults
我们现在可以尝试添加期望并使用 mockito getValidRandomAttempt 适当地创建测试用例:
0. GIVEN
mock_getValidRandomAttempt.side_effect = [None]
WHEN
resultList = perform_experiment(0, 0, some parameters)
THEN
assert len(resultList)==0
1. GIVEN
mock_getValidRandomAttempt.side_effect = [None, 1, 1, 1]
WHEN
resultList = perform_experiment(5, 3, some parameters)
THEN
assert len(resultList)==3
2. GIVEN
mock_getValidRandomAttempt.side_effect = [1, 1, 1, 1]
WHEN
resultList = perform_experiment(5, 3, some parameters)
THEN
assert len(resultList)==3
3. GIVEN
mock_getValidRandomAttempt.side_effect = [1, None, None, None, None]
WHEN
resultList = perform_experiment(5, 3, some parameters)
THEN
assert len(resultList)==1
4. GIVEN
mock_getValidRandomAttempt.side_effect = [1, 1, 1, 1, 1]
WHEN
resultList = perform_experiment(5, 5, some parameters)
THEN
assert len(resultList)==1
5. GIVEN
mock_getValidRandomAttempt.side_effect = [1, 1, 1, 1, 1, 1]
WHEN
resultList = perform_experiment(5, 5, some parameters)
THEN
assert len(resultList)==5
最后但同样重要的是,我鼓励您尽可能不要使用 Python。它的流行程度令人惊讶,同时在测试时有非常严重的缺点:非常不明确的模拟语法和大量的装饰器使得测试几乎完全不可读。