Meetup tech salon
AGENda
-
Test in Django
- Case discuss
testing with django
-
Django supply
- TestCase (unittest) and doctests
- Test Client
- Type of test
- Unit tests
- Integration tests
- Test in Django
- Testing views, add fixtures
- Testing POST requests, forms, models, etc.
What & when
- NOT built-in Python
- NOT built into Django
- model custom methods
- business logic
custom views, forms, template tags, context processors, middleware, management commands - test-first (a.k.a. Test Driven Development) or test-after.
bug report -> create test, test failure -> fix it -> test pass
tests.py
import datetime
from django.test import TestCase
from polls.models import Poll, Choice
class PollsViewsTestCase(TestCase):
fixtures = ['polls_views_testdata.json']
def test_index(self):
resp = self.client.get('/polls/')
self.assertEqual(resp.status_code, 200)
self.assertTrue('latest_poll_list' in resp.context)
self.assertEqual([poll.pk for poll in
resp.context['latest_poll_list']], [1])
Fabfile.py
URL Test in Fabric
def url_test():
urls = ('http://host:8000/res/pic/all',
'http://host:8000/res/pic/87',)
for u in urls:
try:
resp = urlopen(u)
except Exception, e:
print red_bg("open %s error" % u)
abort("test fail, %s" % e)
if resp.code == 200 and bool(loads(resp.read())):
print green_bg('test %s pass' % u)
else:
abort('test ERROR')
case discuss
- emoji / unicode with MySql
CREATE DATABASE xxx DEFAULT CHARACTER SET utf8mb4
MySQL 5.0 5.1 只支持3字节的utf8,5.5支持的 utf8mb4
+--------+--------------------------------------------------------------------------------------+ | Database | Create Database | +--------+--------------------------------------------------------------------------------------+ | tablename | CREATE DATABASE `tablename` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_bin */ | +--------+--------------------------------------------------------------------------------------+
change django
settings.py
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'OPTIONS': {'charset': 'utf8mb4'}, 'NAME': 'dbname', 'USER': 'dev', 'PASSWORD': 'dev', 'HOST': '', 'PORT': '', }, }
_mysql_exceptions.OperationalError: (2019, "Can't initialize character set utf8mb4 (path: /usr/share/mysql/charsets/)
views.py
c=MySQLdb.connect('127.0.0.1', user='root', passwd='passwd', charset='utf8', use_unicode=True).cursor()
c.execute("set names utf8mb4")
unicode error
Error 1:
IntegrityError: (1062, "Duplicate entry 'lol' for key 'name'")
Models.objecsts.get_or_create() ? MySql!
Error 2:
logger.info("Deleted local files of %s" % pic)
DjangoUnicodeDecodeError: 'utf8' codec can't decode byte 0xa1 in position 8: unexpected code byte. You passed in ()
media dir permission
- upload fail because uwsgi change
-
deploy layout
- project data & static data
- config of nginx & uwsgi. ln or not ln?
- log files. rotate?
- permission: develop & www-data
discovery
Vagrant box + virtualbox
Vagrant provides easy to configure, reproducible, and portable work environments built on top of industry-standard technology and controlled by a single consistent workflow to help maximize the productivity and flexibility of you and your team.
UP AND RUNNING
$ vagrant init precise32 http://files.vagrantup.com/precise32.box $ vagrant up
$ vagrant ssh
resources
Links:
testing in django 1, 2
Meetup
By liubo
Meetup
- 2,130