【问题标题】:Same Django unit test fails sometimes and succeeds at other times相同的 Django 单元测试有时会失败,有时会成功
【发布时间】:2014-06-10 15:32:07
【问题描述】:

我有以下 Django 单元测试:

def test_highscores_no_n_success_(self):
    """Checks that top 10 highscores of an owner are returned,
    if no number of highscores is specified in the request"""
    high_score = 100
    for users in range(15):
        user = create_user(1, 1, "aguha")
        user.high_score = high_score
        user.save()
        high_score +=10
    response = self.client.get('/api/highscores/', 
                                {'token': 1, 'key': 1})
    self.assertContains(response, 
                        "\"id\": 10, \"high_score\": 180")

对于以下功能:

def highscores(request):
    """Returns the top n (or 10) high scores for an owner"""
    r = request.GET
    token = r['token']
    owner = Owner.objects.get(api_token=token)
    try:
        n = r['n']
    except KeyError:
        user_count = User.objects.filter(owner=owner).count()
        if user_count >= 10:
            n = 10
        else:
            n = user_count
    top_scorers = User.objects.filter(owner=owner).order_by('-high_score').values('id', 'high_score')[:n]
    top_scorers_json = json.dumps(list(top_scorers))
    return HttpResponse(top_scorers_json,
                    content_type="application/json")

这是create_user 函数:

def create_user(token, key, owner_username):
    """Creates a user object for the purpose of testing"""
    try:
        owner = Owner.objects.get(api_token=token)
    except ObjectDoesNotExist:
        owner = Owner.objects.create(api_token=token, api_key=key, 
                                    username=owner_username)
    return User.objects.create(owner=owner)

奇怪的是,这个测试有时会成功,有时会失败。当它失败时,它说它在响应中找不到"id": 10, "high_score": 180。这怎么可能?每次新测试都会重置数据库,并在测试完成后将其删除,因此这应该不是问题。这里有什么问题?

我最初的假设是它可能与运行测试之间的时间有关。但这似乎没有效果。我可以一个接一个地运行它几次,它会正常工作。然后我回来并在几分钟后运行,但它失败了。我的函数或测试有问题吗?

【问题讨论】:

  • 您在哪里为新创建的用户设置owner 值?
  • create_user函数中,三个参数是tokenkeyusername,这三个指定了owner。它首先检查具有给定值的所有者是否存在;如果没有,它会创建一个新的所有者并将用户分配给所有者。
  • 因此您可能需要发布该函数的代码。您对“键”的使用让我想知道您是否在那里使用了主键的文字值,这不能保证成功:序列通常不会在测试之间重置。
  • 我添加了这个功能。这里的键不是主键;这是Owner 模型中用于识别所有者的特殊字段。它是 CharField 而不是 AutoField。

标签: python django unit-testing


【解决方案1】:

我弄清楚了为什么会出现错误。在返回的列表中,有时id 出现在high_score 之前,即我得到"id": 10, "high_score": 180,这就是测试运行正常的原因。但在其他时候high_score 出现在id 之前,即"high_score": 180, "id": 10,这就是测试失败的原因。

【讨论】:

    猜你喜欢
    • 2020-10-17
    • 1970-01-01
    • 2015-11-15
    • 2010-10-04
    • 1970-01-01
    • 2012-07-12
    • 2017-06-14
    • 2012-09-19
    • 2014-09-19
    相关资源
    最近更新 更多