Django单元测试-- API调用大大减慢了测试速度,优化还是重写?

huus2vyu  于 2023-05-01  发布在  Go
关注(0)|答案(1)|浏览(137)

我有一个调用API的应用程序,我决定编写一个测试,以验证城市是否在URL页面上下文中列出。
我使用了setUpTestData类方法来填充测试数据库,但是当我运行测试时,所花费的时间从0开始。0XX秒,无测试数据库,如5。7XX秒,测试数据库。
我相信是API调用填充数据库导致了速度变慢(我假设这也计入了我对API密钥每小时调用的限制),我想知道测试这样的东西的正确方法是什么?即依赖于API数据来正常工作的东西。
我需要优化我的代码吗?还是我的方法错了?我对单元测试还比较陌生,所以我很感激您的任何提示或建议。
views.py

class WeatherHomeView(TemplateView):
    template_name='weather/home.html'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)

        url = 'API URL'
        cities = City.objects.all()

        weather_data = []

        for city in cities:
            city_weather = requests.get(url.format(city)).json()

            weather = {
                'city' : city,
                'temperature' : city_weather['main']['temp'],
                'description' : city_weather['weather'][0]['description'],
                'icon' : city_weather['weather'][0]['icon'],
            }

            weather_data.append(weather)

        context = {'weather_data' : weather_data}

        return context

test_views.py

class WeatherViewTests(TestCase):

    @classmethod
    def setUpTestData(cls):
        City.objects.create(
            name='denver'
        )
        City.objects.create(
            name='honolulu'
        )
        City.objects.create(
            name='tokyo'
        )
...
    
    def test_home_shows_all_cities(self):
        '''Tests to verify all cities in the DB (3) are listed in the home view.'''
        cities = City.objects.all()
        response = self.client.get(reverse('weather:weather-home'))
        self.assertTrue(len(response.context['weather_data']) == 3)
7cjasjjr

7cjasjjr1#

正如评论员所暗示的,你应该“嘲笑”这些要求。这是一个领域,我有一个真正的。.. * 真的 * 很难的时候,学习如何测试,从来没有真正掌握。所以我尽可能地避开他们关于如何以及何时使用这种技术有很多意见;有人说永远不要嘲笑我有人说,嘲笑一切。这是找到适合你的东西的平衡。
然而,无可争议的是,你永远不应该在测试中调用外部API。如何做取决于你是否想测试;

**a)**请求格式正确
**B)**如果您的应用程序正确处理响应。
**c)**WHEN/IF某些方法被调用
实施例A

mock = Mock(return_value=None)
mock('foo', bar='baz')
mock.assert_called_once_with('foo', bar='baz')
mock('other', bar='values')
mock.assert_called_once_with('other', bar='values')

实施例B

mock = Mock()
mock.return_value = 'fish'
mock()
>> 'fish'

实施例C

mock = Mock()
mock.method()

mock.method.assert_called()

你可以阅读更多关于如何使用unittest的内容。mock here,因为这些都是 * 非常 * 做作的例子。如果你觉得你的知识在理解测试概念(如何/何时/为什么测试)方面有所欠缺,我强烈建议你阅读“Obey the testing goat”。当我在构思要编写的测试时遇到困难时,我经常会提到这一点。

相关问题