Я делаю эти юнит-тесты правильно? - PullRequest
2 голосов
/ 21 января 2010

Я новичок в модульных тестах для своих собственных проектов, так что это моя первая попытка написать модульный тест с нуля. Я использую 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.

Полная ссылка на источник

Ответы [ 2 ]

2 голосов
/ 21 января 2010

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

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

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

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

Чтобы узнать больше о TDD и тестах, вам следует прочитать книгу Разработка через тестирование: на примере

1 голос
/ 21 января 2010

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

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

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