doctest寫測試非常爽:)

最近用django作點小項目,直接使用doctest,用起來真爽.
注意幾點:
1,每個測試用例加註釋,最好和對應的Ticket聯繫起來
2,當前Client工具足夠好用
可以通過status_code,context,content來測試自己的view是否正確
3,可以直接查看models的數據,非常方便
4,比unittest的無用代碼量少多了

示例代碼如下:
有個tribe的app
中間建了一個tests的目錄

tribe/tests$ more __init__.py
# coding=UTF-8
from django.contrib.auth.models import User
from tribe.forms import *
from tribe.models import *
from django.test import Client
import os
from django.contrib.auth.models import Permission

TEST_ROOT = os.path.dirname(__file__)

import doctst
__test__ = {
'Doctest': doctst
}


測試代碼:
# coding=UTF-8
"""
>>> User.objects.all()
[]
>>> admin = User.objects.create_user('admin', '[email protected]', 'eeeee')
>>> admin.save()


#Ticket #2 用戶登錄 account.custom_login
>>> browser = Client()

#invalid login
>>> response = browser.post('/accounts/login/', {'username': 'orphan_user', 'password': 'xxx', 'remember':0})
>>> response.status_code
200

#valid login with username
>>> response = browser.post('/accounts/login/', {'username': 'admin', 'password': 'eeeee', 'remember':0})
>>> response.status_code
302

#valid login with email
>>> browser.logout()
>>> response = browser.post('/accounts/login/', {'username': '[email protected]', 'password': 'eeeee', 'remember':0})
>>> response.status_code
302


#Ticket #5 小組類別列表 ,包括創建 create_category,list_category
>>> Category.objects.all()
[]
>>> response = browser.post('/accounts/login/', {'username': '[email protected]', 'password': 'eeeee', 'remember':0})

#create root category
>>> response = browser.post('/group/category/create/', {'name': 'music'})
>>> Category.objects.all()
[<Category: music>]
>>> response = browser.post('/group/category/create/', {'name': 'book'})

#create sub category
>>> response = browser.post('/group/category/1/create/', {'name': 'classic'})
>>> response = browser.post('/group/category/1/create/', {'name': 'artist'})

#can't create
>>> response = browser.post('/group/category/3/create/', {'name': 'third level categroy'})
>>> response.status_code
403
>>> Category.objects.getList()
[{'category': <Category: music>, 'count': 2, 'child_set': [<Category: classic>, <Category: artist>]}, {'category': <Category: book>, 'count': 0, 'child_set': []}]

#小組首頁 list_category
>>> Category.objects.getList(0,1)
[{'category': <Category: music>, 'count': 2, 'child_set': [<Category: classic>, <Category: artist>]}]
>>> category = Category.objects.all()[0]
>>> category.name
u'music'
>>> response = browser.get('/group/')
>>> len(response.context['objects'])
2

#查看特定小組 view_category
>>> response = browser.get('/group/category/1/')
>>> response.context['objects']
[<Category: classic>, <Category: artist>]
>>> response = browser.get('/group/category/3/')
>>> response.context['objects']
[]


#Ticket #6 創建小組 create_tribe
>>> response = browser.post('/accounts/login/', {'username': '[email protected]', 'password': 'eeeee', 'remember':0})
>>> img_path = os.path.join(TEST_ROOT,'default.jpg')
>>> f = open(img_path)
>>> response = browser.post('/group/category/3/create_tribe/', {'name': 'artist in china','desc':'group 1','icon':f})
>>> f.close()
>>> response.status_code
302
>>> response = browser.get('/group/category/3/')
>>> response.context['objects']
[<Tribe: artist in china>]

#重構加入小組功能
>>> Tribe.objects.all()[0].get_managers()
[<User: admin>]

#不能在top category中創建小組
>>> response = browser.post('/group/category/1/create_tribe/', {'name': 'artist in china','desc':'group 1'})
>>> response.status_code
403


#Ticket #7 用戶加入小組 join_tribe
>>> tribe_user = User.objects.create_user('tribe_user','[email protected]','eeeee')
>>> tribe_user.save()
>>> browser.logout()
>>> response = browser.post('/accounts/login/', {'username': 'tribe_user', 'password': 'eeeee', 'remember':0})
>>> response.status_code
302
>>> response = browser.post('/group/1/join/')
>>> response.content
'{"msg": "msg", "result": "true"}'
>>> tribe = Tribe.objects.all()[0]

#存在最初的創建者
>>> tribe.members.count()
2

#unsubscribe_tribe
>>> response = browser.post('/group/1/quit/')
>>> tribe = Tribe.objects.all()[0]
>>> tribe.members.count()
1

>>> response = browser.post('/group/1/join/')

#Ticket #8new_topic test
>>> Topic.objects.all().count()
0
>>> response = browser.post('/group/1/new_topic/',{'title': 'test topic', 'content':'新內容'})
>>> response.status_code
302
>>> Topic.objects.all().count()
1

#invalid new topic form test
>>> response = browser.post('/group/1/new_topic/',{'title': '測試'})
>>> response.status_code
200
>>> Topic.objects.all().count()
1


#create a tmp user to test invalid new_topic
>>> t_user = User.objects.create_user('t_user','[email protected]','eeeee')
>>> t_user.save()
>>> response = browser.post('/accounts/login/', {'username': 't_user', 'password': 'eeeee', 'remember':0})
>>> response = browser.post('/group/1/new_topic/',{'title': '測試', 'content':'新內容'})
>>> response.status_code
403

#Test invalid reply
>>> response = browser.post('/group/topic/1/reply/',{'content':'新內容'})
>>> response.status_code
403


#Test valid replay
>>> browser.logout()
>>> response = browser.post('/accounts/login/', {'username': 'tribe_user', 'password': 'eeeee', 'remember':0})
>>> response.status_code
302
>>> response = browser.post('/group/topic/1/reply/',{'content':'replay 1'})
>>> Reply.objects.all().count()
1
>>> response = browser.post('/group/topic/1/reply/',{'content':'replay 2'})
>>> response = browser.post('/group/topic/1/reply/',{'content':'replay 3'})
>>> response = browser.post('/group/topic/1/reply/',{'content':'replay 4'})


#小組話題列表Ticket #9 topic_list
>>> response = browser.post('/group/1/new_topic/',{'title': 'topic1', 'content':'新內容'})
>>> response = browser.post('/group/1/new_topic/',{'title': 'topic2', 'content':'新內容'})
>>> response = browser.post('/group/1/new_topic/',{'title': 'topic3', 'content':'新內容'})
>>> response = browser.get('/group/1/')
>>> response.status_code
200
>>> response.context['topics']
[<Topic: test topic>, <Topic: topic1>, <Topic: topic2>, <Topic: topic3>]

#查看話題 view_topic
>>> response = browser.get('/group/topic/1/')
>>> response.context['topic']
<Topic: test topic>
>>> response.context['topic'].reply_set.all()
[<Reply: replay 1>, <Reply: replay 2>, <Reply: replay 3>, <Reply: replay 4>]


#Ticket #12查看話題 list_member
>>> response = browser.get('/group/1/member/')
>>> response.context['members']
[<User: admin>, <User: tribe_user>]

#Ticket #13自己加入 my_tribe
#current user:tribe_user
>>> response = browser.get('/group/mine/')
>>> response.context['tribes']
[<Tribe: artist in china>]

>>> Tribe.objects.all()
[<Tribe: artist in china>]

#創建小組加入
>>> response = browser.post('/group/category/3/create_tribe/', {'name': 'artist in china 2','desc':'group 2'})
>>> response = browser.post('/group/category/3/create_tribe/', {'name': 'artist in china 3','desc':'group 3'})
>>> response = browser.post('/group/category/3/create_tribe/', {'name': 'artist in china 4','desc':'group 4'})


>>> response = browser.post('/group/1/join/')
>>> response = browser.post('/group/2/join/')
>>> response = browser.post('/group/3/join/')

>>> browser.logout()
>>> response = browser.post('/accounts/login/', {'username': 'tribe_user', 'password': 'eeeee', 'remember':0})
>>> response = browser.get('/group/mine/')
>>> response.context['tribes']
[<Tribe: artist in china>, <Tribe: artist in china 2>, <Tribe: artist in china 3>, <Tribe: artist in china 4>]
>>> response = browser.get('/group/1/quit/')
>>> response = browser.get('/group/mine/')
>>> response.context['tribes']
[<Tribe: artist in china 2>, <Tribe: artist in china 3>, <Tribe: artist in china 4>]

>>> response = browser.post('/group/1/join/')

>>> response = browser.get('/group/1/latest_member/')
>>> response.context['memberships']
[<Membership: tribe_user is a member of 'artist in china'>, <Membership: admin is a member of 'artist in china'>]

Ticket #14 我的發言
>>> response = browser.get('/group/1/my_topic/')
>>> response.context['topics']
[<Topic: test topic>, <Topic: topic1>, <Topic: topic2>, <Topic: topic3>]

Ticket #15
>>> Tribe.objects.all()
[<Tribe: artist in china>, <Tribe: artist in china 2>, <Tribe: artist in china 3>, <Tribe: artist in china 4>]

>>> User.objects.all()
[<User: admin>, <User: tribe_user>, <User: t_user>]

>>> tribe = Tribe.objects.get(pk=1)
>>> tribe.name
u'artist in china'
>>> tribe.get_managers()
[<User: admin>]

>>> User.objects.get(pk=2).username
u'tribe_user'
>>> User.objects.get(pk=3).username
u't_user'

#添加管理員
>>> response = browser.post('/group/1/grant/2/')
>>> response.status_code
403

#添加管理員
>>> browser.logout()
>>> response = browser.post('/accounts/login/', {'username': 'admin', 'password': 'eeeee', 'remember':0})
>>> response = browser.post('/group/1/grant/2/')
>>> response.content
'{"msg": "", "result": true}'

>>> tribe.get_managers()
[<User: tribe_user>, <User: admin>]

#刪除管理員
>>> response = browser.post('/group/1/revoke/2/')
>>> response.content
'{"msg": "", "result": true}'

#小組搜索
>>> response = browser.get('/group/search/',{'search_text': 'china 3'})
>>> response.context['tribes']
[<Tribe: artist in china 3>]

#刪除組員
>>> tribe.get_members()
[<User: tribe_user>, <User: admin>]
>>> tribe.get_managers()
[<User: admin>]

>>> response = browser.get('/group/1/del_tribe_user/3/')
>>> response.content
'{"msg": "not a tribe user.", "result": false}'

>>> response = browser.get('/group/1/del_tribe_user/1/')
>>> response.content
'{"msg": "can\\\'t delete tribe creator", "result": false}'

>>> response = browser.get('/group/1/del_tribe_user/2/')
>>> response.content
'{"msg": "delete tribe user successfully.", "result": true}'

>>> Topic.objects.all()
[<Topic: test topic>, <Topic: topic1>, <Topic: topic2>, <Topic: topic3>]

#都是trib user
>>> Topic.objects.all()[0].creator
<User: tribe_user>

#no permission
>>> browser.logout()
>>> response = browser.post('/accounts/login/', {'username': 't_user', 'password': 'eeeee', 'remember':0})
>>> response = browser.get('/group/topic/1/del_topic/')
>>> response.status_code
403

#creator
>>> browser.logout()
>>> response = browser.post('/accounts/login/', {'username': 'tribe_user', 'password': 'eeeee', 'remember':0})
>>> response = browser.get('/group/topic/1/del_topic/')
>>> response.status_code
302


#管理員可以刪除
>>> Topic.objects.all()[2].tribe.get_managers()
[<User: admin>]
>>> admin = User.objects.get(username='admin')
>>> browser.logout()
>>> response = browser.post('/accounts/login/', {'username': 'admin', 'password': 'eeeee', 'remember':0})
>>> response = browser.get('/group/topic/2/del_topic/')
>>> response.status_code
302


#有權限刪除
>>> t_user = User.objects.get(username='t_user')
>>> t_user.user_permissions.all()
[]
>>> p = Permission.objects.get(codename="del_topic")
>>> t_user.user_permissions.add(p)
>>> t_user.save()
>>> a = User.objects.get(username='t_user')
>>> a.user_permissions.all()
[<Permission: tribe | topic | Can delete tribe topics>]
>>> a.has_perm('tribe.del_topic')
True

>>> browser.logout()
>>> response = browser.post('/accounts/login/', {'username': 't_user', 'password': 'eeeee', 'remember':0})
>>> response = browser.get('/group/topic/3/del_topic/')
>>> response.status_code
302


"""
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章