Есть ли в моём модульном тесте необнаруженная логическая ошибка? - PullRequest
0 голосов
/ 10 октября 2019

Я пытаюсь увидеть, чего мне не хватает, во всяком случае, в тестовом модуле Python. Меня недавно попросили написать несколько юнит-тестов. Я новичок в области информационных технологий, и я никогда раньше не проводил юнит-тестирование. После прохождения нескольких уроков у меня появилось приличное понимание, когда речь заходит о тестировании основных функций и обеспечении работоспособности, но кто-то может, пожалуйста, взглянуть на приведенное ниже и сказать мне, если я что-то упускаю логически?

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

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

import unittest, os, json

class TestLoadFile(unittest.TestCase):
    """Set up unittests for loading a file."""

    def setUp(self):
        data = {
            "name": "mike smith",
            "location": "atlanta, ga",
            "languages": {
                "first": "python",
                "second": "ruby",
                "third": "javascript"
            },
            "salary": "75000"
        }

        with open('test.json', 'w', encoding='utf-8') as f:
            json_info = json.dump(data, f, ensure_ascii=False, indent=4)

    def tearDown(self):
        os.unlink('test.json')

    def test_read_file(self):
        with open('test.json', 'r') as json_file:
            data = json.load(json_file)
            try:
              test_data_1 = data['name']
              test_data_2 = data['location']
              test_data_3 = data['languages']['second']
              test_data_4 = data['marital_status']

              # Assertions
              self.assertEqual(test_data_1, "mike smith")
              self.assertIn("atlanta", test_data_2)
              self.assertEqual(test_data_3, "ruby")
              self.assertRaises(KeyError, test_data_4)
            except:
              pass

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

Обратите внимание, что это всего лишь макет, очевидно. Я включил только попытку / исключение, потому что она продолжала давать сбой на KeyError, и я не был уверен, как явно обойти это без обобщения попытки / исключение. Есть ли что-то, что я не проверяю для этого, особенно если речь идет о юнит-тесте, включающем чтение файла? Я просто пытаюсь стать более сильным читателем кода, чтобы он помог мне создавать лучшие юнит-тесты.

Спасибо, большое!

1 Ответ

1 голос
/ 10 октября 2019

Обычно модульное тестирование включает тестирование небольшого блока вашего кода, чтобы убедиться, что он работает правильно. Тем не менее, здесь кажется, что вы просто тестируете, правильно ли работает python (можете записать / прочитать файл и разобрать его в словарь).

Этот тест кажется мне ненужным, потому что мы знаем, что Python работает. Нам не нужно писать дополнительный модульный тест, чтобы убедиться, что базовая функциональность Python работает, потому что если он просто случайно перестает работать, возникают большие проблемы.

Однако, если вы написали собственный метод для разборафайл, и он должен быть в определенном формате, когда после синтаксического анализа я бы рекомендовал проверить это точно!

mycode.py
----
def parse_config(path_to_config):
  if not os.path.exists(path_to_config):
     raise RuntimeException(f"Config file not found at path: {path_to_config}")

config = {
 'name': None,
 'location': None,
 'languages': None
}
with open(path_to_config, 'r') as json_file:
 config_data = json.load(json_file)

 for config_key in config.keys():
   if config_key in config_data:
     config[config_key] = config_data[key]

return config

test.py
---
def test_parse_config():

 with self.assertRaises(RuntimeException):
   parse_config('')

 config = parse_config('test.json')

 self.assertEqual(config['name'], 'mike smith')
 self.assertEqual(config['location'], 'atlanta')

 with self.assertRaises(KeyError):
   config['marital_status']
...