如何在Unitest中重用unitest方法而不实际测试它

时间:2017-06-28 13:15:40

标签: python unit-testing methods flask

我遇到一个问题,我只需要它们作为简单的方法运行测试。例如,在test_add_waiter中,我必须首先使用self.test_register_user()注册用户。我这样做,所以我不会重复代码(register_user方法工作正常,我从实际的测试类复制它)。但测试(test_register_user)作为测试运行,我想要测试它,但将其用作方法。你有什么建议我呢?有没有办法在类的 init 中忽略它。或者我在想这个。我必须面对这个问题很多测试类。

示例代码

#。/测试/ test_basics.py

import os
import unittest
from flask import current_app
from app import create_app
from app import db


class BasicsTestCase(unittest.TestCase):
    def setUp(self):
        self.app = create_app('testing')
        self.app_context = self.app.app_context()
        self.app_context.push()
        self.client = self.app.test_client()
        db.create_all()

    def tearDown(self):
        db.session.remove()
        db.drop_all()
        os.remove('../test.db')
        self.app_context.pop()

    def test_app_exists(self):
        self.assertFalse(current_app is None)

    def test_app_is_testing(self):
        self.assertTrue(current_app.config['TESTING'])

#。/测试/应用/ test_api_app_menu.py

import json
from flask import url_for

from tests.fake_data import create_random_waiter_item
from ..test_basics import BasicsTestCase

class MenuTestCase(BasicsTestCase):

    def test_register_user(self):
        # http://stackoverflow.com/questions/28836893/how-to-send-requests-with-jsons-in-unit-tests
        res = self.client.post(url_for('/auth.authentication'), data=json.dumps({"email": "test@gmail.com",
                                                                                 "username": "test",
                                                                                 "password": "123456"}),
                               content_type='application/json')
        return self.assertTrue(res.status_code == 200)

    def test_register_user_id(self):
        # http://stackoverflow.com/questions/28836893/how-to-send-requests-with-jsons-in-unit-tests
        res = self.client.post(url_for('/auth.authentication'),
                               data=json.dumps({"email": "test@gmail.com",
                                                "username": "test",
                                                "password": "123456"}),
                               content_type='application/json')

        data = json.loads(res.data)

        self.assertTrue(data["user_id"] == 1)

    def test_add_waiter(self):
        # register user in order to register a store.
        self.test_register_user()

        sample_item = {"items": create_random_waiter_item()[0]}

        res = self.client.post(url_for('/manage.waiter')+"?store_id=1", data=json.dumps(sample_item),
                               content_type='application/json')

        # data = json.loads(res.data)
        self.assertTrue(res.status_code == 201)

    # Todo 19/3/2017 - fix the unique constraint error  wher registered user is ran along with register user

    def test_get_menu(self):
        # register user in order to register a store.
        # self.test_register_user()
        self.test_add_waiter()

        res = self.client.get(url_for('/app.menu')+"?store_id=1&cell_phone=1234567890&pin_number=1234",
                              content_type='application/json')
        self.assertTrue(res.status_code == 200)

    def test_get_menu_bad_url(self):
        # register user in order to register a store.
        self.test_add_waiter()

        res = self.client.get(url_for('/app.menu')+"?store_id=&cell_phone=6900000000&pin_number=123456",
                              content_type='application/json')
        self.assertTrue(res.status_code == 400)

1 个答案:

答案 0 :(得分:2)

我想你可能已经过度思考了。如果它是一个夹具/实用工具方法,你可以将其命名为其他东西,然后不必担心测试套件执行它。

我最近迷上了DAMP测试。我首先在jay领域阅读有关它们的惊人书籍,有效地进行单元测试。 Jay字段认为,重复每个测试的客户端发布逻辑有助于长期维护,但代价是重复。

目前您发布的代码非常简单。用户的概念非常简单,需要1行才能创建。根据我的经验,当共享夹具方法时,用户的概念会发生变化。有些测试需要准系统用户,其他测试需要指定用户名,年龄或权限。这开始创建一个frankenstein测试方法,需要适应每一个测试,并且变得非常复杂。

Jay字段建议为每个单独的测试提供运行所需的所有数据,其中:

  • 仅创建绝对必要的数据以执行受测试系统
  • 将所有数据创建隔离到测试方法,这样当测试失败时,您只需要查看失败的测试代码,而不必遵循方法调用(对于您所在的庞大代码库而言,这会产生很大的影响)许多人对每一行代码都没有深入了解,IMO)

这是以每次测试都创建自己的数据为代价的。如果域模型发生显着变化,即如果您不再需要用户但需要实体(或其他内容),则需要您触及几乎所有测试。

但是根据我的经验,专注于无法委派的测试,是节省时间和节省复杂性的时间与域模型转移到足以触及所有测试的罕见时间