用于JSON文件读取的Python中的TDD

时间:2014-11-13 18:52:09

标签: python json unit-testing

我使用Python读取JSON文件并将每条记录转换为类实例。我已经有了一个示例JSON文件,但是对于Python代码,我第一次尝试使用测试驱动开发(TDD)方法。以下是我的(示例)JSON文件中的数据:

[{"Name": "Max", "Breed": "Poodle", "Color": "White", "Age": 8},
 {"Name": "Jack", "Breed": "Corgi", "Color": "Black", "Age": 4},
 {"Name": "Lucy", "Breed": "Labrador Retriever", "Color": "Brown", "Age": 2},
 {"Name": "Bear", "Breed": "German Shepherd", "Color": "Brown", "Age": 6}]

我知道我想测试所有实例的每个参数中的有效条目。例如,我想根据可接受品种的元组检查品种,并检查年龄总是以整数形式给出。鉴于我完全缺乏TDD经验,我不清楚检查JSON导入代码产生的对象的代码是本身测试,还是我应该使用一组JSON测试导入代码和单独的集合来测试导入代码生成的实例。

1 个答案:

答案 0 :(得分:0)

这是两个独立的实例。测试JSON负载与测试加载的json数据完全不同。加载数据不应该很复杂。 (json.loads)。但是如果你需要测试它,尽可能保持最小和细粒度。你的测试不应该相互影响。

通常,您的测试用例应该测试代码的非常特定部分。也就是说,它应该测试程序的特定功能。因为您提到验证加载的json数据(例如,繁殖),这意味着您的程序也应该具有此验证功能。对于这个例子,你会得到类似下面的测试用例。

import doggie

def test_validate_breed():
    # Positive test case -- everything here should pass.  (Assuming you give good data)
    # your load_json routine itself could be a test.  But generally this either works or
    # it raises a json exception...  At any rate, load_json returns a list of dictionaries
    # like those you described above.
    l = load_json()
    for d in l:
        assert doggie.validate_breed(d)

    # Generate an invalid dictionary entry
    d = { "Name": "Some Name", "Breed": "Invalid!", ... }
    assert False == doggie.validate_breed(d)

def test_validate_age():
    l = load_json()
    for d in l:
        assert doggie.validate_age(d)

    # generate an invalid dictionary entry
    d = { "Name": "Some Name", ... , "Age": 1000 }
    assert False == doggie.validate_age(d)

测试之美在于它暴露了设计中的缺陷。它非常善于暴露不必要的耦合。

我建议你检查鼻子进行单元测试。它使运行测试变得简单,并提供了更好的实用功能,可以更好地描述测试失败。例如:

>>> import nose.tools as nt
>>> nt.assert_equal(4, 5)
Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "C:\MSFBPY27\lib\unittest\case.py", line 509, in assertEqual
    assertion_func(first, second, msg=msg)
  File "C:\MSFBPY27\lib\unittest\case.py", line 502, in _baseAssertEqual
    raise self.failureException(msg)
AssertionError: 4 != 5