Дизайн модульных тестов - PullRequest
0 голосов
/ 19 июня 2011

несколько дней назад я написал код как часть моего собеседования. Вопросу была дана текстовая находка, если текст запроса присутствует в данном тексте или нет. Я использовал хеш-таблицу для сохранения заданного текста (ключи - это слова, присутствующие в тексте, а значение - позиция этого слова в тексте). Итак, теперь, учитывая строку запроса, я смог найти расположение слов, присутствующих в тексте, и отобразить фрагмент текста с максимальным количеством слов запроса. Я думал, что все было хорошо до сих пор.

Но меня также попросили написать для него модульный тест. Хотя я никогда раньше не писал модульных тестов, но я знал, почему они так необходимы в процессе разработки. Итак, я создал несколько тестовых случаев, имея в виду средний тестовый случай, а также граничный случай. Но что мне не было ясно, так это то, нужно ли нам заранее знать правильный вывод, чтобы написать контрольный пример или нет.

Я начал с того, что получил несколько текстов для ввода в программу и соответствующий вывод, поместил их в класс и позже прочитал их как ввод для моей программы.

Код модульного теста показан ниже:

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()

Очевидно, я завалил, и мне не было дано никакой причины, и теперь я пытаюсь выяснить, был ли этот код ЕДИНЫМ. Может ли кто-нибудь помочь мне определить проблемы в модульных тестах, что делать, если вы заранее знаете, как выводится ваш код, и для этого нужно написать модульные тесты. например, можем ли мы написать модульные тесты для генератора случайных чисел?

Заранее спасибо !!!

Ответы [ 2 ]

1 голос
/ 19 июня 2011

Я бы сказал, что если вы знаете, что должен делать ваш код, тогда вы можете написать модульный тест. В вашем тестовом поисковом случае, я думаю, можно с уверенностью сказать, что вы можете определить ожидаемый результат для набора заданных входных данных. Возможно, у вашего интервьюера были проблемы с кодировкой соответствия текста и тестами, а не с принципами, которые вы использовали. Да, вы можете проверить генератор случайных чисел, если помните, что в вычислениях у вас есть только генераторы псевдослучайных чисел. Реалистичные, полезные вещи, которые вы можете проверить этой весной, состоят в том, что генератор выдает одинаковую выходную мощность для одного и того же начального числа, и что период должен быть не короче, чем вы его определили. Вы можете или не можете заботиться о том, что данное семя производит заранее установленную последовательность. Это должно быть отражено в тестовом наборе и документации.

Мой подход состоит в том, чтобы начать с тестов и написать код так, чтобы они все прошли (см. разработка через тестирование ). Он не только обеспечивает хорошее покрытие тестами, но и помогает определить функциональность кода перед его написанием.

0 голосов
/ 19 июня 2011

Современный подход к разработке программного обеспечения предполагает, что практически любое программное обеспечение может и должно быть протестировано.У Google есть много ответов относительно тестирования генераторов случайных чисел.См http://en.wikipedia.org/wiki/Software_testability и http://www.google.com/search?q=testing+random+number+generators

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...