设计单元测试

2024-10-03 09:15:26 发布

您现在位置:Python中文网/ 问答频道 /正文

几天前,作为面试过程的一部分,我写了一个代码。问题是给定文本中是否存在查询文本。我使用hashtable保存给定的文本(键是文本中出现的单词,value是单词在文本中的位置)。所以现在给定了查询字符串,我可以找到文本中出现的单词的位置,并显示一个包含最大查询单词的文本片段。我以为到现在一切都很好。在

但我也被要求为它编写单元测试。虽然我以前从未编写过单元测试,但我知道为什么在开发过程中需要它们。所以我创建了一些测试用例,记住了平均测试用例和边界用例。但我不清楚的是,为了编写测试用例,我们是否需要事先知道正确的输出。在

我首先得到一些文本作为程序的输入,以及相应的输出,把它们放到一个类中,然后作为程序的输入读入。在

单元测试代码如下:

import unittest
import random
import generate_random_test
class c_Known_Output():
Input_Text1 = '''We ordered the traditional deep dish pizza and a Manchego salad. Were started off with a complimentary bread, that looks like a really big hamburger bun top at first glance. Even though it was free bread, it was soft and slightly sweet and delicious. I liked dipping it in the balsamic reduction and olive oil from the salad plate. The salad dish was perfectly fine, but I wish the Manchego slices on top were somehow sliced a bit thinner. The deep dish traditional pizza came out a bit later (remember the 40 min. cooking time, folks!), piping hot and smelling delicious. At first bite, I wasnt sure how much I liked it.'''

Output_Text1 = '''I liked dipping it in the balsamic reduction and olive oil from the salad plate. The salad [[HIGHLIGHT]]dish[[ENDHIGHLIGHT]] was perfectly fine, but I wish the Manchego slices on top were somehow sliced a bit thinner. The [[HIGHLIGHT]]deep dish[[ENDHIGHLIGHT]] traditional pizza came out a bit later (remember the 40 min. cooking time, folks!), piping hot and smelling delicious.'''

Input_Text2 = '''Best tacos I have ever had Lived down the road from this truck for years. Watched almost every episode of BSG eating these tacos with beer. Moved to Az and El Chato is one of the things I miss the most! ANYONE that is around them, you have to go here.'''

Output_Text2 = '''Best [[HIGHLIGHT]]tacos[[ENDHIGHLIGHT]] I have ever had Lived down the road from this truck for years. Watched almost every episode of BSG eating these [[HIGHLIGHT]]tacos[[ENDHIGHLIGHT]] with beer. Moved to Az and El Chato is one of the things I miss the most!'''

Query_Not_found = '''Query Not Found'''


class c_myTest( unittest.TestCase ):
Generator = generate_random_test.TestCaseGenerator()
KnowOutput = c_Known_Output()

def testAverageCase1(self):
    """no keywords present...no highlight"""
    output = highlight.m_Highlight_doc( self.KnowOutput.Input_Text1, 'deep dish')
    print "\nTest Case 1"
    print output
    self.assertEqual(output, self.KnowOutput.Output_Text1)

def testAverageCase2(self):
    output = highlight.m_Highlight_doc( self.KnowOutput.Input_Text2, 'burrito taco take out')
    print "\nTest Case 2"
    print output
    self.assertEqual(output, self.KnowOutput.Output_Text2)

def testSnippetLength(self):
    """ if the search word is present only once in the text...check if the snippet is of optimum length...optimum length is defined as one sentence before
    and after the sentence in which the query word is present"""
    output = highlight.m_Highlight_doc( self.KnowOutput.Input_Text3, 'tacos')
    print "\nTest Case 3"
    print output
    self.assertEqual(output, self.KnowOutput.Output_Text3)

def testSmallText(self):
    """The text is just one sentence, with the query present in it. The same sentence should be the output"""
    output = highlight.m_Highlight_doc( self.KnowOutput.Input_Text4, 'deep dish pizzas')
    print "\nTest Case 4"
    print output
    self.assertEqual(output, self.KnowOutput.Output_Text4)

def testBadInput(self):
    """no keywords present...no highlight"""
    output = highlight.m_Highlight_doc( self.KnowOutput.Input_Text4, 'tacos')
    print "\nTest Case 5"
    print output
    self.assertEqual(output, self.KnowOutput.Query_Not_found)

#Now test with randomly generated text
def testDistantKeywords(self):
    """the search queries are very distant in the text. 6 query words are generated. First 4 of these queries are inserted in one paragraph and the last two
    queries are inserted in another. The snippet should be of the first paragraph which has the maximum number of query words present in it."""
    query = self.Generator.generateSentence(6, 5)
    text1 = self.Generator.generateTextwithQuery( query[0:4], 10, 10, 5, 3 )
    text2 = self.Generator.generateTextwithQuery( query[5:], 10, 10, 5, 3 )
    text1.append('\n')
    text1.extend(text2)
    print "\nTest Case 6"
    print "=========================TEXT=================="
    print ' '.join(text1)
    print "========================QUERY=================="
    print ' '.join(query)
    print " "
    output_text = highlight.m_Highlight_doc( ' '.join(text1), ' '.join(query))
    print "=======================SNIPPET================="
    print output_text
    print " "


if __name__=='__main__':
    unittest.main()

很明显,我不及格,没有给我任何理由,现在我正试图弄清楚这段代码是否就是我想要的。有人能帮我找出单元测试中的问题吗?如果你事先知道你的代码的输出,并且必须为此编写单元测试,你应该怎么做。例如,我们可以为随机数生成器编写单元测试吗?在

提前谢谢!!!在


Tags: andofthein文本selfinputoutput
2条回答

目前的软件开发方法表明,几乎任何一个软件都可以而且应该进行测试。谷歌有很多关于测试随机数生成器的答案。参见http://en.wikipedia.org/wiki/Software_testability和{a2}

我想说,如果你知道你的代码应该做什么,那么你就可以写一个单元测试了。在您的测试搜索案例中,我认为可以安全地说,您可以确定一组给定输入的预期输出。你的面试官可能对文本匹配器的编码和测试比对你使用的原则有更多的问题。对于随机数生成器,是的,您可以测试它,只要您记住在计算中只有伪随机数生成器。现实的,有用的东西,你可以测试的春天在脑海里是发电机产生相同的输出相同的种子,并且周期不短于任何你定义它。你可能在乎也可能不在乎一个给定的种子产生一个预先建立的序列。这应该反映在测试套件和文档中。在

我的方法是从测试开始编写代码,使它们都通过(参见test driven development)。它不仅为您提供了良好的测试覆盖率,而且有助于在编写代码之前定义代码的功能。在

相关问题 更多 >