2010-01-21 3 views
2

Я новичок в модульных тестах для своих собственных проектов, так что это моя первая попытка написать единичный тест с нуля. Я использую python и модуль unittest. Класс TodoList, тестируемый здесь, является оберткой для фактических списков, с несколькими дополнительными методами для таких вещей, как сохранение на диск. Он также определяет несколько способов получения элементов по их идентификатору в списке (который не совпадает с индексом списка).Действительно ли я выполняю эти модульные тесты?

тесты (я вырезал несколько вспомогательных методов, а также хорошие несколько тестов ради, не имея людей прокручивать навсегда):

class TodoListTests(unittest.TestCase): 

    def setUp(self): 
     self.testdata = open("./testdata.json", "r") 
     self.testdata_text = self.testdata.read() 
     self.testdata.close() 

    def tearDown(self): 
     try: 
      os.remove("./todo.json") 
     except OSError: 
      # File not created, no need to delete. 
      pass 

    def create_todolist_and_safe_list(self): 
     self.create_data_file() 
     self.todolist = todolist.TodoList("./todo.json") 
     self.list = json.loads(self.testdata_text) 

    def create_data_file(self): 
     datafile = open("./todo.json", "w") 
     datafile.write(self.testdata_text) 
     datafile.close() 

    # Snip out a few more helper methods 

    def test_loop(self): 
     self.create_todolist_and_safe_list() 
     test_list = [] 
     for item in self.todolist: 
     test_list.append(item) 

     self.assertEquals(test_list, self.list) 


    def test_save(self):  
     self.create_todolist_and_safe_list() 
     self.todolist.save() 
     newfile_text = self.get_data_file_as_string() 
     self.assertEquals(newfile_text, self.testdata_text) 

    # Snip out the rest of the tests. 

Full link to source

ответ

2

Я думаю, что вы Правильно. Но я пошлю некоторые предложения;

  • Перемещение self.testdata.close() из setUp() функции tearDown().
  • Окружать других открыть/закрыть с помощью блоков try/finally. Итак, если файл не открывается с успехом, он будет закрыт.

    try: 
     file.open() 
    finally: 
     file.close() 

  • лучше организовать тестовые папки. Я предлагаю вам создать папку с именем _tests, и внутри этой папки вы должны поместить модуль тестирования (в вашем случае у вас есть только один модуль). Затем для каждого модуля создайте папку с именем модуля и поместите файлы, используемые в тестах модуля внутри этой папки.

Чтобы узнать больше о TDD и тестов вы должны прочитать книгу Test Driven Development: By Example

1

Нет, это не совсем похожи на вас. Единичные тесты должны быть небольшими, быстрыми и несложными. Выполнение «сложных» тестов (все, что зависит от внешней базы данных, файловой системы, конфигурации, среды или действительно чего-либо вне самого теста и проверяемого кода) является ценным, но не должно быть частью вашего «основного блока» тесты». В модульных тестах следует проверить, что код соответствует спецификации. Один тест должен подтвердить, что с правильным вводом вы получите ожидаемый результат. Для проверки правильного поведения на некорректном входе должен существовать другой единичный тест. Это часто повторяется для разных типов правильного или неправильного ввода, но обычно есть много тестов для неправильного ввода, чем что-либо. Тем не менее, без спецификации, на самом деле у вас не так много для модульного теста. Обычной проблемой является отсутствие технической спецификации (спецификации), которая сообщает вам, какой правильный или неправильный ввод и что делать в каждом случае.

Кроме того, что вы нажимаете файловую систему, ваши тесты выглядят хорошо.

Смежные вопросы