odoo

Packer.Odoo.10---Chapter 8

2017-10-16  本文已影响38人  F4A3

编写测试类,Debug代码。

单元测试。

添加单元测试

from odoo.tests.common import TransactionCase

class TestWizard(TransactionCase):
    def setUp(self, *args, **kwargs):
        super(TestWizard,self).setUp(*args, **kwargs)
        # Add test setup code here...

    def test_populate_tasks(self):
        "Populate tasks buttons should add 5 tasks"
        # Add test code

编写一个测试实例

    def test_populate_tasks(self):
        "Populate tasks buttons should add 5 tasks"
        self.wizard.do_populate_tasks()
        count = len(self.wizard.task_ids)
        self.assertEqual(count, 2, 'number wrong')

添加一个新的测试实例,测试 do_mass_update() 方法。

    def test_mass_change(self):
        'Mass change deadline'
        self.wizard.do_populate_tasks()
        self.wizard.new_deadline = self.todo1.date_deadline
        self.wizard.do_mass_update()
        self.assertEqual(
            self.todo1.date_deadline,
            self.todo2.date_deadline,
        )

这个测试实例很好理解,首先调用了do_populate_tasks()方法,把我们的两个task记录获取到向导表单中,然后把第一个任务的截止日期作为新的截止日期,执行do_mass_update()方法.最后进行断言任务1跟任务2的截止日期肯定是相同的.

设置测试类基础数据

在使用测试前,应该先把基础数据准备好,如添加2条用以进行测试的任务记录.
我们在使用测试类实例时,为了能测试不同的用户权限,可以使用sudo()这个方法来改变当前的用户环境.

class TestWizard(TransactionCase):
    def setUp(self, *args, **kwargs):
        super(TestWizard,self).setUp(*args, **kwargs)
        self.env['todo.task'].search([('is_done','=',False)]).write({'is_done':True})
        # Demo user will be used to run tests
        demo_user = self.env.ref('base.user_demo')
        # Create two Todo tasks to use in tests
        t0 = date.today()
        Todo = self.env['todo.task'].sudo(demo_user)
        self.todo1 = Todo.create({
            'name': 'Todo1',
            'date_deadline': fields.Date.to_string(t0),
        })
        self.todo2 = Todo.create({
            'name': 'Todo2',
        })
        # Create Wizard instance to use in tests
        Wizard = self.env['todo.wizard'].sudo(demo_user)
        self.wizard = Wizard.create({})

为了测试我们的向导逻辑,我们首先定义了2条新的Todo tasks 记录, 然后指定测试用户为Demo用户. 最后创建向导实例来作为测试的基础数据.

测试异常

很多时候我们需要测试代码中是否会有异常抛出.
在下面的例子中,测试方法test_count()使用了with self.assertRaises()来测试向导表单中的方法do_count_tasks()是否能抛出Warning异常.

from odoo.exceptions import Warning
    def test_count(self):
        "Test count button"
        with self.assertRaises(Warning) as e:
            self.wizard.do_count_tasks()
        self.assertIn(' 2 ', str(e.exception))

上面的代码中,我们还对抛出异常后的异常信息进行断言,判断2是否包含在异常信息中。因为根据do_count_tasks()这个方法,会把任务的总数作为警告信息抛出。我们正好可以使用2来判断是否把总的任务个数传递出来。

运行测试类

使用命令

./odoo-bin -d todo --test-enable -i todo_wizard --stop-after-init --addons-path="..."

来执行我们已经编写好的测试实例.

关于YAML 测试

这种测试方式在Odoo10中已经基本不使用了 .

开发工具

调试代码

Python 调试器

import pdb; pdb.set_trace()

然后重启服务,Odoo程序就会在断点的地方停止,出现pdb 交互界面,等待你的进一步输入。注意,手动插入pdb断点,不需要设置--dev选项也可以进行。如果设置了--dev选项,会在应用报错后自动进入pdb交互模式。
pdb调试常用指令:

一个简单的调试会话事例

    def do_populate_tasks(self):
        self.ensure_one()
        import pdb; pdb.set_trace()
        Task = self.env['todo.task']
        ....

重启服务端,打开To-do Tasks Wizard 表单,点击Get All 按钮,然后返回命令行窗口,会看到服务端进入了pdb调试交互界面。

命令行pdb界面

开头的第一行表明了目前处于Python文件中的路径跟目前执行的代码的行号。第二行展示了Odoo将要执行的命令。

可选的python调试工具

除了Odoo默认提供的pdb调试工具,还有像ipdb,pudb这样的更加先进的调试工具

import pudb; pudb.set_trace()
上一篇 下一篇

猜你喜欢

热点阅读