Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 以敏捷/BDD方式在Django中使用doctest的示例_Python_Django_Agile_Doctest - Fatal编程技术网

Python 以敏捷/BDD方式在Django中使用doctest的示例

Python 以敏捷/BDD方式在Django中使用doctest的示例,python,django,agile,doctest,Python,Django,Agile,Doctest,我感兴趣的是学习如何以更敏捷的/BDD方式进行测试和单元测试。 我发现了一些看似合理的教程,但它们只是缩略图。 我真正想看到的是一些采用BDD风格开发的Django项目的源代码 我不清楚的是如何处理请求对象等。 我有一种情况,我已经部署了我的应用程序,我在生产中的行为与我在开发中的行为完全不同,甚至与生产服务器上的pythonshell完全不同。我希望一些医生能帮助我诊断这一点,并为首先编写测试的更灵活过程打开大门 具体来说,下面是我要测试的代码: def match_pictures_with

我感兴趣的是学习如何以更敏捷的/BDD方式进行测试和单元测试。 我发现了一些看似合理的教程,但它们只是缩略图。 我真正想看到的是一些采用BDD风格开发的Django项目的源代码

我不清楚的是如何处理请求对象等。 我有一种情况,我已经部署了我的应用程序,我在生产中的行为与我在开发中的行为完全不同,甚至与生产服务器上的pythonshell完全不同。我希望一些医生能帮助我诊断这一点,并为首先编写测试的更灵活过程打开大门

具体来说,下面是我要测试的代码:

def match_pictures_with_products( queryset, number_of_images = 3):      
    products = []  
    i = 0    
    for product in queryset:  
       if i < ( number_of_images ):  
           image =  product.imagemain_set.all()[:1]  
           product.photo_url = image[0].photo.url  

       products.append(product)  
       i += 1  

    return products  

def index(request):  
    """returns the top 10 most clicked products"""     
    products = Product.objects.all()[:10]  
    products = match_pictures_with_products( products, 10)  .  
    return render_to_response('products/product_list.html', {'products': products}) 
def将图片与产品匹配(查询集,图片数量=3):
产品=[]
i=0
对于queryset中的产品:
如果i<(图像的数量):
image=product.imagemain\u set.all()[:1]
product.photo\u url=图像[0]。photo.url
products.append(产品)
i+=1
退货
def索引(请求):
“”“返回单击次数最多的前10个产品”“”
products=Product.objects.all()[:10]
产品=将图片与产品匹配(产品,10)。
返回render_to_响应('products/product_list.html',{'products':products})
如何创建确保索引返回10个对象的Doctest?

产品查询似乎可以在生产服务器上的shell中正常工作。实际服务器根本没有返回任何产品。

该软件包在您的doctests中可能很有用,因为您希望分析生产服务器的呈现HTML答案。

您的视图编写方式很难测试。您必须对html进行刮取,以查看您想要的内容是否存在,然后您需要进行更多的测试。最好重写您的视图,使其更易于测试。首先参数化模板名称,以便创建简单的测试模板:

def index(request, template_name='products/product_list.html'):  
    """returns the top 10 most clicked products"""     
    products = Product.objects.all()[:10]  
    products = match_pictures_with_products( products, 10)  .  
    return render_to_response(template_name, {'products': products})
然后,您可以编写一个简单的模板,只计算产品的数量:

{{ products.count }} 

并确保模板返回“10”

我以前也问过自己同样的问题。我发现doctest对于视图、模型方法和管理器等方面的效用有限,因为

  • 您需要能够设置和拆卸测试数据集,以便实际用于测试
  • 视图需要接受一个请求对象。在医生考试中,这是从哪里来的
  • 出于这个原因,我一直使用Django框架为您处理所有这些。然而,不幸的是,您并没有从doctests中获得一些好处,这使得TDD/BDD更难实现。接下来是关于如何实现这一目标的纯粹猜测:

    我认为您应该从各自的模块和函数中获取doctest,并在单元测试框架中执行它们。这将负责测试数据设置/拆卸。如果您的doctest是在Django的unittest.TestCase子类的某个测试方法中执行的,那么它们就能够使用该测试数据库。您还可以将模拟请求对象传递到文档测试的执行上下文中。下面是一个提供模拟请求对象的。假设您想测试所有应用程序视图中的docstring。您可以在tests.py中执行以下操作:

    from ??? import RequestFactory
    from doctest import testmod, DocTestFailure
    from django.test import TestCase
    
    from myapp import views
    
    class MyAppTest(TestCase):
    
        fixtures = ['test_data.json']
    
        def test_doctests(self):                
            try:
                testmod(views, extraglobs={
                    'REQUEST': RequestFactory()
                }, raise_on_error=True)
            except DocTestFailure, e:
                self.fail(e)
    
    这将允许您执行以下操作:

    def index(request):  
        """
        returns the top 10 most clicked products
    
        >>> response = index(REQUEST)
        >>> [test response content here]
    
        """     
        products = Product.objects.all()[:10]  
        products = match_pictures_with_products( products, 10)  .  
        return render_to_response('products/product_list.html', {'products': products})
    
    同样,这只是我的想法,根本没有经过测试,但我认为这是唯一一种不需要将所有视图测试都放在单元测试框架中就可以满足需要的方法

    您可以使用并测试设置的上下文变量:

    >>> response = client.get('/foo/')
    >>> response.context['name']
    'Arthur'
    

    您还可以检查响应代码,以确保页面返回了成功的
    200

    我不确定是否遵循了此操作。你会用Doctest测试模板吗?我希望看到一些Django项目已经实现了这一点。如果你想要一个BDD工具,试试莴苣。