1 def test_add_1(): 2 """tasks.get() using id returned from add() works.""" 3 task = Task('breathe', 'BRIAN', True) 4 task_id = tasks.add(task) 5 t_from_db = tasks.get(task_id) 6 # everything but the id should be the same 7 assert equivalent(t_from_db, task) 8 9 10 def equivalent(t1, t2): 11 """Check two tasks for equivalence.""" 12 # Compare everything but the id field 13 return ((t1.summary == t2.summary) and 14 (t1.owner == t2.owner) and 15 (t1.done == t2.done)) 16 17 18 @pytest.fixture(autouse=True) 19 def initialized_tasks_db(tmpdir): 20 """Connect to db before testing, disconnect after.""" 21 tasks.start_tasks_db(str(tmpdir), 'tiny') 22 yield 23 tasks.stop_tasks_db()
1.新建的Task對象,其id會被置為None,只有在發生數據庫交互之后其id才會被填入相應的值。
2.equivalent()方法檢查id之外的所有屬性是否相等
3.autouse的fixture能確保數據庫可訪問
運行結果:
@pytest.mark.parametrize(argnames, argvalues)裝飾器達到批量傳送參數的目的
1 @pytest.mark.parametrize('task', 2 [Task('sleep', done=True), 3 Task('wake', 'brian'), 4 Task('breathe', 'BRIAN', True), 5 Task('exercise', 'BrIaN', False)]) 6 def test_add_2(task): 7 """Demonstrate parametrize with one parameter.""" 8 task_id = tasks.add(task) 9 t_from_db = tasks.get(task_id) 10 assert equivalent(t_from_db, task)
parametrize()的第一個參數是用逗號分隔的字符串列表'task';第二個參數是一個值列表‘Task對象列表’,pytest會對每個task做測試,並分別報告每一個測試用例結果。
將parametrize()的task對象列表替換為幾組鍵值對
1 @pytest.mark.parametrize('summary, owner, done', 2 [('sleep', None, False), 3 ('wake', 'brian', False), 4 ('breathe', 'BRIAN', True), 5 ('eat eggs', 'BrIaN', False), 6 ]) 7 def test_add_3(summary, owner, done): 8 """Demonstrate parametrize with multiple parameters.""" 9 task = Task(summary, owner, done) 10 task_id = tasks.add(task) 11 t_from_db = tasks.get(task_id) 12 assert equivalent(t_from_db, task)
運行結果: