Найти - Пользователи
Полная версия: unittest and socket
Начало » Python для новичков » unittest and socket
1
nrm
Начал изучать unittest - красивая штука и лично мне помогает представить что же я на самом хочу от функции.
Но вот загвоздка не могу понять как подружить данную технологию с TCP socket'ами.
Может я плохо ищу, но пока правильность сетевого кода приходится проверять ручками. Буду признателен за “полезные” ссылки или примеры.
Андрей Светлов
Подменяете в тесте объект сокета своей заглушкой.
Чтобы не создавать велосипед каждый раз, используйте mock objects.
Лично мне нравится http://labix.org/mocker
nrm
Большое спасибо, пошел разбираться с mock object'ами
bw
Забей на моки, делай свои фейковые объекты.
Я сам к модульному тестированию стал серьёзно относиться совсем недавно, и вот такой у меня получился fake_urllib2:
# -*- coding: utf-8 -*-

import base64
import zlib
import urllib2
import StringIO


def up_opener():
global orig_opener, fake_opener

if urllib2._opener is not fake_opener:
orig_opener = urllib2._opener
urllib2.install_opener(fake_opener)


def down_opener():
global orig_opener, fake_opener

if urllib2._opener is fake_opener:
orig_opener = None
urllib2.install_opener(orig_opener)


class FakeHandler(urllib2.BaseHandler):

def __init__(self, fake_data):
self.fake_data = fake_data

def default_open(self, request):
url = request.get_full_url()

if url in self.fake_data:
data = self.fake_data[url]if type(data) is tuple:
headers, data = data
else:
headers = {}

headers.setdefault('content-type', 'text/javascript; charset=UTF-8')
headers['content-length'] = len(data)

response = urllib2.addinfourl(
StringIO.StringIO(data),
code = 200,
url = url,
headers = headers)

response.msg = '[fake] ok'

else:
response = urllib2.addinfourl(
StringIO.StringIO(),
code = 500,
url = url,
headers = {})

response.msg = '[fake] unexpected url "%s"'%url

return response


fake_data = {
'http://maps.google.com/maps/geo?q=40.765017,-74.011187&output=json&oe=utf8&hl=en&sensor=false':
'''eJzdWE1v20YQvftXEDzTxM7uzn7kpiZFC8NwDbhBUQQ9bKhFTFgiU4qqYwT67x2SEkPJSyuWFDcN
b+QMZ3fnvTcz5OezKIoLN/fxqyiWLNUKGejkXMuUAYDRcdJ43NSuXi7I5zPd0X1WTps3OGNJ96Dy
fy/9om6ifPBlaybDqn35euYyP3fVHVnfbSLk08b3I8TrAG46rfyiWSL+w/tbd3/niyS6ukiitzeT
jdOkc3rja5fP+u3EkyxbVi57iKNXkWxd49flsqir9km3YPv2PC/yRV25Ov/HTyrvhuawx1WTGvKK
ry7Wm+g8b5bv94Zr/C7LzM3y+uGxaWjtV+mPHm/5rpLtqMHV+yC/LqeLchhhdbYTZpOe/pUvOd42
vm6A7BzaeKuzdYz450+1L6Z++sbVLh4k+dLVl2XxU/kpHh44LsqqvqVHDcU0omTmy5HiRbnsjWiU
sGJg9K6l1bkWqbVWAOqB8d6vjURXAUIw3Bz1bHDg+LrMi3q4y6wsq2leuNovWlJ2fEfBBSTtNpRm
lqkkYtFfZ5t4q2SHvPwp8ka/l/fF4jb/SAwu8tpPo0ZEtN7Xc7kT18bzMi9aLN6FFolpnyeAxjDN
gI1Bo9S2sYeGksdAWKXGoOHSSPaS0Ih9dSWikxr13OqCP0h1SR45X5eL2s02en8UbNvlajl/76s2
ZpvGeNd9tfXgxypfhimDT2mE2XGNcM3GNCIU5fIlNSIDGumSTwLx99GFrxb+4bkSEd+XRP7XXDNc
oLIjXFOSgzRBrlGrNNIYMcI1IJIaZY/gGgoErjquSRRg7R6uYYBrz+mEp0mmAjOSTGlp7hU4NncA
4lamB8nklhsLRwgXgHNkXTKVkqg135NMFUjm4YLl306w35GYIBWoJRch/IWhqm4U6uBwI1JD9V6x
oJgwRSVoZj0Cf8moaQBv8WdoqIibPfjrAP6/UOprX7WF+8+yujt86hRjU+fuEqeYOSGlmZI6qgrB
YkmWBoUIwgKpQUUVcAQWAgXtUTOnoH7NO1gsWsbpq+RpWEwAlkNBgHFR/mcaopSjMIaxkIaANKSV
2DZuwFKq1ZCWgRoKmqVoSXvsULAsphraIpxEQqc0+XBJ23gaLBuqoc1Bo0k9c0WdZ9FvmXfFKT7X
gnGPF4+yqdJc0BXAg2pJdz2GA4B6jqEhIPS5ZkSK3FAZggPRaFSrNmgQMlLRqLAPDWDjcMx9lWfu
hDisAx4PgMFUAmgbbCpNZ4ARPVB1kWIHnF4OOgVJ3wIHywEYphyx+XmXRCgJTrQK5D4EQn/iTi+F
lxVBw2YtpNm2rlHgIYn0MtDNr6jmxYNRSBVYhUhdo7mRkohi9k12EPqltCbsSXp4H+sE7BepEgbC
7eAcbUolwGoV4j8n4ShqFiZQgY7vB18ngCYB/wJnEo8s'''}



for url, data in fake_data.items():
data = fake_data[url]if type(data) is tuple:
data = data[-1]

data = zlib.decompress(base64.decodestring(data))

if type(fake_data[url]) is tuple:
data = fake_data[url][:-1] + (data,)

fake_data[url]= data


orig_opener = None
fake_opener = urllib2.build_opener(FakeHandler(fake_data))
О том, насколько я ошибаюсь можно рассуждать долго, я пока и сам не уверен, что использование такого подхода труЪ (собственно я и urllib2 не часто пользуюсь, больше под twisted работаю). А вообще здравая изоляция (в данном случае от капризов сети) в тестировании вопрос интересный.

p.s. up_opener и down_opener используются в setUp и tearDown соответственно, что очевидно.

..bw
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB