在python中测试elif-else条件的有效方法是什么
我有很多python程序需要评估。程序的基本框架包含一组嵌套的If-elif-else语句。我想知道,测试(生成测试用例)程序最有效的方法是什么 以下是该计划的要点在python中测试elif-else条件的有效方法是什么,python,if-statement,testing,Python,If Statement,Testing,我有很多python程序需要评估。程序的基本框架包含一组嵌套的If-elif-else语句。我想知道,测试(生成测试用例)程序最有效的方法是什么 以下是该计划的要点 if month == 1: if day <= 20: print("Capricorn") else: print("Aquarius") elif month == 5: if day <= 21: print("Taurus") e
if month == 1:
if day <= 20:
print("Capricorn")
else:
print("Aquarius")
elif month == 5:
if day <= 21:
print("Taurus")
else:
print("Gemini")
else:
if day <= 21:
print("Sagittarius")
else:
print("Capricorn")
如果月份==1:
如果第二天开始写测试,但包括一个覆盖工具。您可以安装并直接使用,也可以与测试运行程序一起使用,如nose
或zope.testrunner
它将告诉您测试是否未能执行代码的任何行;运行测试后,代码覆盖率报告会给出覆盖率百分比和您遗漏的准确行数
您甚至可以使用其他工具,如可视化您可能错过的线路,或与Jenkins或TeamCity等持续集成工具集成,以跟踪随时间推移的覆盖范围 测试几乎总是基于提供输入和期望输出。但是,在实现测试之前,需要指定使用代码的接口。它是一个提供API的库吗?然后直接测试API。也就是说,明确定义外部代码将调用的那些函数或方法,然后以与外部代码使用它们完全相同的方式测试它们。还是一个命令行工具?然后测试命令行行为
如何确保测试嵌套条件结构中的所有不同代码路径?如果你想检查占星术的迹象,你可以使用以下方法来仔细思考和评估。:
monthday = month * 100 + day
if monthday <= 120:
print("Capricorn")
elif monthday <= 219:
print("Aquarius")
and so on
monthday=月*100+天
如果monthday有一些工具,例如,可以向您显示测试用例是否覆盖了所有代码。然而,当一个程序开始有这么多特殊情况时,最好考虑重新组织它
在这种情况下,数据的存储方式会产生很大的不同。这将通过一个if
语句执行所有逻辑:
html输出的示例:
这表明覆盖率为100% 对于这样一个有大量排列和组合的问题,您应该创建一个包含所有可能输入和预期输出的矩阵,然后创建一个可以迭代表中所有行的通用测试用例
为什么是矩阵?因为这是想象这种情景的最简单方法。例如,如果你收集了24个不同的测试,某人很难快速回答像“你是否涵盖2月29日的案例?”这样的问题。有了表中的所有日期和期望值,回答这样的问题就变得微不足道,当代码更改时添加额外的测试用例就变得微不足道了
例如,您可以从每月创建一行开始,因为您的代码似乎基于日历。然后,为每个月创建所有重要条件的行——月的第一天、月的最后一天、月内的特殊日期(即:如果20号的结果与21号的结果不同,等等)
您的表在概念上可能如下所示:
| # month | day | sign
| 1 | 1 | capricorn
| 1 | 20 | capricorn
| 1 | 21 | aquarius
| 5 | 1 | taurus
| 5 | 21 | taurus
| 5 | 22 | gemini
。。。等等然后,编写一个测试,可以读取每一行,调用函数,并将输出与预期结果进行比较
我所说的“全部”并不一定指全部。您需要定义正常情况和边缘情况,但不一定要测试每个可能的日期 我建议将其设置为表驱动:
testtable = {1: (20, "Capricorn", "Aquarius"),
5: (21, "Taurus", "Gemini")}
def test(month, day):
vals = testtable.get(month,
(21, "Sagittarius", "Capricorn")) # default
print( vals[1 + (day <= vals[0])] )
test(1, 20) # --> Aquarius
test(1, 21) # --> Capricorn
test(3, 21) # --> Capricorn
test(3, 22) # --> Sagittarius
test(5, 21) # --> Gemini
test(5, 22) # --> Taurus
testtable={1:(20,“摩羯座”、“水瓶座”),
5:(21,“金牛座”、“双子座”)}
def测试(月、日):
VAL=testtable.get(月,
(21、“射手座”、“摩羯座”)#默认值
打印(VAL[1+(水瓶座日)
测试(1,21)#-->摩羯座
测试(3,21)#-->摩羯座
测试(3,22)#-->射手座
测试(5,21)#-->双子座
测试(5,22)#-->金牛座
这是对代码的潜在改进,但它并没有回答如何最好地测试代码的问题。你完全没有抓住问题的关键,即如何测试代码。据我们所知,占星术只是一个玩具示例。他的真正问题是如何编写(甚至更好地生成)测试具有大量分支的任意代码。@JohnY OK。答案重新编写。覆盖率很好;易于安装并使用,具有良好的报告功能。如果您需要测试运行程序,stdlib中还有unittest模块,可用于简单情况。如何测试不产生输出或具有返回等副作用的If或else条件值?例如:if(cond=true){do something;}else{do nothing;}
如何测试nothing
情况?@ChintanPathak:如果需要测试函数是否不返回任何内容,可以使用值${NONE}
。
| # month | day | sign
| 1 | 1 | capricorn
| 1 | 20 | capricorn
| 1 | 21 | aquarius
| 5 | 1 | taurus
| 5 | 21 | taurus
| 5 | 22 | gemini
testtable = {1: (20, "Capricorn", "Aquarius"),
5: (21, "Taurus", "Gemini")}
def test(month, day):
vals = testtable.get(month,
(21, "Sagittarius", "Capricorn")) # default
print( vals[1 + (day <= vals[0])] )
test(1, 20) # --> Aquarius
test(1, 21) # --> Capricorn
test(3, 21) # --> Capricorn
test(3, 22) # --> Sagittarius
test(5, 21) # --> Gemini
test(5, 22) # --> Taurus