在python中测试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

我有很多python程序需要评估。程序的基本框架包含一组嵌套的If-elif-else语句。我想知道,测试(生成测试用例)程序最有效的方法是什么

以下是该计划的要点

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