我不明白这个单元测试是如何失败的

时间:2011-08-01 20:41:29

标签: python python-2.7

以下是单元测试的一部分:

from nose.tools import *
from testing import *


def test_directions():
        assert_equal(scan("north"), [('direction', 'north')])
        result = scan("north south east")
        assert_equal(result, [('direction', 'north'), ('direction', 'south'), ('direction', 'east')])

这是我的代码:

import string

def convert_number(s):
    try: 
        return int(s)
    except ValueError:
        return None

def scan(s):

    direction_words= ("north", "south", "east", "west", "down", "up", "left", "right", "back", "forwards", "backwards")
    verbs= ("go", "stop", "kill", "eat", "shoot", "run", "hide", "dodge")
    stop_words= ("the", "in", "of", "from", "at", "it")
    nouns= ("door", "bear", "princess", "cabinet", "gold", "money", "chest", "gun", "sword")        
    numbers= s.split()
    i=0
    j=0
    g=0
    m=0
    a=0
    b=0

    while a < len(numbers):
        if  type(convert_number(numbers[a])) == int:
            print [('number', int(numbers[a]) )]
            a += 1
        else:
            a += 1


    while i < len(direction_words):
        if direction_words[i] in s.split():
            s= string.lower(s)
            print [('direction', direction_words[i] ) ]
            i+=1 
        else:
            i+=1                

    while j < len(verbs):
        if verbs[j] in s.split():
            s= string.lower(s)
            print [('verb', verbs[j] )]
            j+=1
        else:
            j+=1    

    while g < len(stop_words):
        if stop_words[g] in s.split():
            s= string.lower(s)
            print [('stop', stop_words[g] )]
            g+=1
        else:
            g+=1

    while m < len(nouns):
        if nouns[m] in s.split():
            s= string.lower(s)
            print [('noun', nouns[m] )] 
            m+=1

        else:
            m+=1            

    while b< len(s.split()):      
        if numbers[b] not in nouns:
            if numbers[b] not in stop_words:
                if numbers[b] not in verbs:
                    if numbers[b] not in direction_words:
                        if  type(convert_number(numbers[b])) != int:   
                            print [('error', numbers[b] )]
                            b += 1

                        else:
                            b+=1    
                    else: b+=1
                else: b+=1
            else: b+=1
        else: b+=1


    else:
        return

当我运行单元测试时,我得到的是:

F
======================================================================
FAIL: tests.ex48_tests.test_directions
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/nose/case.py", line 197, in runTest
    self.test(*self.arg)
  File "/Users/Adam/Desktop/projects/ex48/tests/ex48_tests.py", line 6, in test_directions
    assert_equal(scan("north"), [('direction', 'north')])
AssertionError: None != [('direction', 'north')]
-------------------- >> begin captured stdout << ---------------------
[('direction', 'north')]

--------------------- >> end captured stdout << ----------------------

----------------------------------------------------------------------
Ran 1 test in 0.015s

FAILED (failures=1)

我不明白测试是如何失败的。当我在终端中运行程序时,它产生的结果与单元测试中的结果完全相同。我不明白为什么不通过。

4 个答案:

答案 0 :(得分:4)

因为您的功能打印结果而不是返回

while i < len(direction_words):
    if direction_words[i] in s.split():
        s= string.lower(s)
        print [('direction', direction_words[i] ) ] # <--- HERE
        i+=1 

我还没有读完所有的LPTHW,所以我无法确切地告诉你在本书的上下文中修复此代码的最佳方法是......但如果我正在编写它,我会返回一个列表,像这样:

def scan(s):
    result = []
    ...

    while i < len(direction_words):
        if direction_words[i] in s.split():
            s= string.lower(s)
            # change the `print` statements to `result += …`
            result += [('direction', direction_words[i] ) ]
            i+=1 

    ...
    return result

答案 1 :(得分:1)

函数scan()返回None。所以断言:

assert_equal(scan("north"), [('direction', 'north')])

正确失败。

答案 2 :(得分:0)

您的scan()函数会将文本打印到屏幕上并且不返回任何内容,但是您的单元测试正在检查函数的返回值。

您应该更改scan()功能,以便它返回您感兴趣的输出,而不仅仅是打印它。

答案 3 :(得分:0)

您的代码存在许多问题,但最明显的一点是scan永远不会返回任何内容,因此result始终为None