我从来没有在我的生活中写过任何测试,但我想开始为我的Django项目编写测试.我已经阅读了一些关于测试的文章,并决定尝试为一个非常简单的Django应用程序或者开始编写一些测试.
该应用程序有两个视图(列表视图和详细信息视图)和一个包含四个字段的模型:
class News(models.Model):
title = models.CharField(max_length=250)
content = models.TextField()
pub_date = models.DateTimeField(default=datetime.datetime.now)
slug = models.SlugField(unique=True)
Run Code Online (Sandbox Code Playgroud)
我想向您展示我的tests.py文件并询问:
是否有意义?
我甚至在测试正确的东西吗?
是否有我不遵循的最佳实践,你可以指点我吗?
我的tests.py(它包含11个测试):
# -*- coding: utf-8 -*-
from django.test import TestCase
from django.test.client import Client
from django.core.urlresolvers import reverse
import datetime
from someproject.myapp.models import News
class viewTest(TestCase):
def setUp(self):
self.test_title = u'Test title: b?rek??'
self.test_content = u'This is a content 156'
self.test_slug = u'test-title-bareksc'
self.test_pub_date = datetime.datetime.today()
self.test_item = News.objects.create(
title=self.test_title,
content=self.test_content,
slug=self.test_slug,
pub_date=self.test_pub_date,
)
client = Client()
self.response_detail = client.get(self.test_item.get_absolute_url()) …Run Code Online (Sandbox Code Playgroud) 我将我的第一个Django项目从DjangoEurope转移到Webfaction,这开始出现一个看起来像内存泄漏的问题.随着每个请求服务器进程的内存使用量增加约500kb.它永远不会失败.这种情况一直持续到Webfaction因使用太多内存而导致死亡.
当我在浏览器中刷新Django的管理界面时,我可以清楚地看到这一点(虽然每个页面都会发生这种情况,不仅仅是管理界面 - 我虽然管理界面会是一个不错的测试用例,因为那里没有我的代码) .随着每个浏览器重新加载,内存使用量增加几百千字节.
我使用Webfaction建议的命令测试内存:
ps -u publica -o rss,etime,pid,command
Run Code Online (Sandbox Code Playgroud)
更多关于我的设置:
DEBUG 调成 False编辑:我创建了一个空的Django项目 - 默认的Django配置django.contrib.admin和新的空数据库(同时使用mysql和postgresql).我开始在浏览器中重新加载Django管理员并观察内存使用情况.起初我看到了问题 - 每次重新加载后内存使用量都会增加.但随后它稳定下来并停止增长.这与我的原始项目在Django Europe上的表现一致.不幸的是,在Webfaction上它似乎永远不会稳定(或者至少不在我帐户可用的内存限制内).有什么建议?
我有一个简单的MyUser课PermissionsMixin.user.is_superuser等于True只能由超级用户.我希望能够在我的网站上做类似的事情admin.py:
if request.user.is_superuser:
fieldsets = (
(None, {'fields': ('email', 'password')}),
('Permissions', {'fields': ('is_admin','is_staff')}),
('Place', {'fields': ('place',)}),
('Important dates', {'fields': ('last_login',)}),
)
else:
fieldsets = (
(None, {'fields': ('email', 'password')}),
#('Permissions', {'fields': ('is_admin','is_staff')}),
('Place', {'fields': ('place',)}),
('Important dates', {'fields': ('last_login',)}),
)
Run Code Online (Sandbox Code Playgroud)
基本上我希望我的用户能够创建其他用户,但不要给他们管理员或东西权限.只有超级用户才能做到这一点.
我的模型中定义了一个UNIQUE约束:
class FooBar(models.Model):
_name = 'my.foobar'
# ...
_sql_constraints = [
('foo_bar_uniq', 'unique("foo", "bar")', 'You could not step twice into the same foobar!')
]
Run Code Online (Sandbox Code Playgroud)
以及一个用于创建新对象的代码的控制器:
class FooBarController(http.Controller):
@http.route('/foobar/create/', auth='public', website=True)
def create(self, foo, bar):
http.request.env['my.foobar'].create({
'foo': foo,
'bar': bar,
})
return http.request.render('my.thank_you_page')
Run Code Online (Sandbox Code Playgroud)
如果违反了UNIQUE约束,我会得到一个IntegrityError例外.我想抓住它并向用户显示不同的消息:
from psycopg2 import IntegrityError
class FooBarController(http.Controller):
@http.route('/foobar/create/', auth='public', website=True)
def create(self, foo, bar):
try:
http.request.env['my.foobar'].create({
'foo': foo,
'bar': bar,
})
return http.request.render('my.thank_you_page')
except IntegrityError:
return http.request.render('my.error_page')
Run Code Online (Sandbox Code Playgroud)
这有点......有点儿.在IntegrityError成功地抓住了,但随后的所有数据库操作(其中,因为据我所知,通过自动的触发website模块)结束InternalError:
InternalError: current …Run Code Online (Sandbox Code Playgroud) 我有一个WebView水平滚动里面的垂直滚动PageView。像这样:
PageView.builder(
itemCount: 5,
itemBuilder: (context, index) {
return WebView(
initialUrl: 'https://flutter.dev/docs',
gestureRecognizers: [
Factory(() => VerticalDragGestureRecognizer()),
].toSet(),
);
},
);
Run Code Online (Sandbox Code Playgroud)
在Flutter的先前稳定版本(1.5.4)中,此操作按预期工作-垂直滚动将在WebView中移动内容,水平滚动将在PageView中移动。
升级到Flutter后,此操作中断了v1.7.8+hotfix.3。现在,即使手势几乎完全是垂直的,水平滚动似乎总是可以取胜的。如果页面完全垂直滚动,则仅在手势停止之后(即,当我在手势之后停止触摸屏幕时)-在手势发生时不会进行垂直滚动。
添加和删除VerticalDragGestureRecognizer从gestureRecognizers没有任何效果现在-无论哪种方式,程序,工作起来就像识别器不在名单上(尽管这并不是说gestureRecognizers完全忽略,因为加入EagerGestureRecognizer确实有效果)。
这是手势竞技场的调试输出(请记住,我试图将笔势保持尽可能垂直,但是即使HorizontalDragGestureRecognizer我也垂直移动了手势,即使手指稍微向两侧移动也足以赢得胜利。全部时间):
I/flutter (30125): Gesture arena 14 ? ? Opening new gesture arena.
I/flutter (30125): Gesture arena 14 ? Adding: Instance of '_CombiningGestureArenaMember'
I/flutter (30125): Gesture arena 14 ? Adding: LongPressGestureRecognizer#9cad1(debugOwner: GestureDetector, state: ready)
I/flutter (30125): Gesture arena 14 ? Adding: …Run Code Online (Sandbox Code Playgroud) attrs="{'invisible': [('rule_id.type_test', '!=', 'A')]}" 在上面的代码不起作用,我怎么能解决这个问题?
class test_list(models.Model):
_name = 'test.list'
type_test = fields.Selection([('A', 'aaaa'),('B','bbbbb')], default='A', string="Type", required=True)
rule_list = fields.One2many('test.rule', 'rule_id')
Run Code Online (Sandbox Code Playgroud)
class test_rule(models.Model):
_name = 'test.rule'
rule_id = fields.Many2one('test.list', required=True)
ul = fields.Many2one('product.ul', string='Package Logistic Unit'
Run Code Online (Sandbox Code Playgroud)
<record model="ir.ui.view" id="rules_form_view">
<field name="name">test.rules.form.view</field>
<field name="model">test.rule</field>
<field name="arch" type="xml">
<form string="Test Rules">
<field name="ul" attrs="{'invisible': [('rule_id.type_test', '!=', 'A')]}"/>
</form>
</field>
</record>
Run Code Online (Sandbox Code Playgroud) 标题可能有点令人困惑,但我不知道怎么称呼它.
我想创建一个Django项目,其中包含大量应用程序,您可以使用INSTALLED_APPSsettings.py中的选项任意打开或关闭(您显然还需要编辑urls.py并运行syncdb).打开应用后应该能够自动:
在网站范围的搜索中注册它的内容.幸运的是django-haystack有这个内置功能,所以这不是问题.
注册cron工作.django-cron正是如此.不是问题.
注册应显示在主页上的小部件.主页应包括具有不同应用程序的小部件的框列表.
我考虑过包含标签,因为您可以将它们放在页面上的任何位置,它们可以控制内容和演示文稿.问题是我不知道如何自动获取我的应用程序提供的包含标记列表,并在主页上逐个显示它们.我需要一种方法以某种方式注册它们,然后显示所有注册的标签.
我已经定义了以下两个odoo ORM模型:
class Weekday(models.Model):
_name = 'ludwik.offers.weekday'
name = fields.Char()
class Duration(models.Model):
_name = 'ludwik.offers.duration'
weekday = fields.Many2many('ludwik.offers.weekday')
Run Code Online (Sandbox Code Playgroud)
当我尝试启动odoo时,我收到以下消息:
ProgrammingError: relation "ludwik_offers_duration_ludwik_offers_weekday_rel_ludwik_offers_" already exists
Run Code Online (Sandbox Code Playgroud)
此外,当我更改_name模型中的属性时,问题仍然存在(当然错误消息中的关系名称会更改以反映重命名),因此它不仅仅与数据库中已存在的某些旧关系发生冲突.
我想为manfacture组中的每个人发送通知,所以我尝试了这个代码,但它不起作用
manf_categ_ids=self.pool.get('ir.module.category').search(cr,uid,[('name','=','Manufacturing')],context=context)[0]
users=self.pool.get('res.groups').browse(cr, uid, manf_categ_ids , context=context).users
for user in users:
recipient_partners = []
recipient_partners.append(
(4, user.partner_id.id)
)
#user_ids=self.pool.get('res.users').search(cr,uid,[('groups_id','=',manf_categ_ids)],context=context)
post_vars = {'subject': "notification about order",
'body': "Yes inform me as i belong to manfacture group",
'partner_ids': recipient_partners,} # Where "4" adds the ID to the list
# of followers and "3" is the partner ID
thread_pool = self.pool.get('mail.thread')
thread_pool.message_post(
cr, uid, False,
type="notification",
subtype="mt_comment",
context=context,
**post_vars)
Run Code Online (Sandbox Code Playgroud)
2个用户属于制造组的问题,但用户列表只包含1个元素,当我使用该用户登录时,此代码不发送任何通知
python ×6
django ×4
odoo ×4
openerp ×3
exception ×1
flutter ×1
memory-leaks ×1
mod-wsgi ×1
openerp-8 ×1
orm ×1
postgresql ×1
relationship ×1
unit-testing ×1