2015-11-13 4 views
0

Я новичок в тестировании модулей python. Я играл с unittest и py.test. Я хочу проверить данные в формате ini. ПримерТест динамического теста на Python

[Section1] 
key1 = value1 
key2 = value2 
key3 = value3 
... 
[Section2] 
key1 = value1 
... 

Названия разделов могут быть разными в ini-файле. У меня есть данные, и я сравниваю его с разделом/именами клавиш.

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

+0

Я не понимаю, что это связано с модульное тестирование. Это, по-видимому, касается фактической функциональности программы. –

+0

Вы используете Python 2 или 3? – jeedo

+0

Я использую python 3.5. Я пытаюсь проверить мои данные конфигурации против золотой копии. Я не уверен, является ли единичный тест правильным термином. Я полагаю, что я могу использовать unittest framework для генерации результатов теста. – Danny

ответ

1

Где находится gold.cfg:

[Раздел1]
ключ1 = значение1
ключ2 = значение2
ключ3 = значение3

[Раздел 2]
Key4 = value4
key5 = value5
ключ6 = значение6

[Раздел 3]
key7 = value7
key8 = ценности8
key9 = value9

А где example.cfg является:

[Раздел1]
ключ1 = значение1
ключ2 = значение2
ключ3 = значение3

[Раздел 2]
ключ1 = значение1

# -*- coding: utf-8 -*- 
import unittest 

try: 
    import ConfigParser as configparser # Python 2 
except ImportError: 
    import configparser # Python 3 


class TestValidConfig(unittest.TestCase): 
    def setUp(self): 
     self.gold_config = configparser.RawConfigParser() 
     self.gold_config.read('gold.cfg') 
     self.allowed_section_names = self.gold_config.sections() 
     return None 

    def _test_allowed_section_names_pass(self): 
     example_config = configparser.RawConfigParser() 
     example_config.read('example.cfg') 
     for section_name in example_config.sections(): 
      self.assertTrue(section_name in self.allowed_section_names) 
     return None 

    def test_values_by_section_pass(self): 
     """Test example using setUp()""" 
     example_config = configparser.RawConfigParser() 
     example_config.read('example.cfg') 

     for section_name in example_config.sections(): 
      example_pairs = example_config.items(section_name) 
      gold_pairs = self.gold_config.items(section_name) 
      self.assertTrue(set(example_pairs).issubset(set(gold_pairs))) 
     return None 

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

Итерация по сечению имени с секциями (метод): for section_name in example_config.sections().

Метод items() возвращает список ключей, кортежей значений, поэтому используйте set, чтобы утверждать, что список пар ключей, значений из файла примера - это subset ключей, пара значений из вашей золотой копии.

(Если золото копия имеет один раздел в списке все разрешенные пары ключ/значение, изменить код так, что название раздела используется в явном виде при сравнении.)

+0

Удивительная благодарность за ввод. Что делать, если имена разделов неизвестны? Я пытался выяснить, как создавать тестовые функции «на лету» на основе имен разделов, которые неизвестны до времени исполнения. – Danny

+0

@Danny Класс RawConfigParser имеет метод section(), который возвращает список всех имен разделов. Поэтому для «config» или «self.config», если вы ссылаетесь на объект из setUp(), просто используйте 'sections_list = config.section() ' – binarysubstrate

+0

В порядке, чтобы получить список разделов с вызовом' config.sections'. В приведенном выше коде у вас есть специальные тестовые функции, например, 'test_section_one_keys_pass'. Как создать эти функции «на лету» из списка разделов? – Danny