6

よりアジャイル/BDD の方法で Doctest と Unit テストを行う方法を学ぶことに興味があります。妥当と思われるチュートリアルをいくつか見つけましたが、それらは単なるサムネイルです。私が本当に見たいのは、BDD スタイルで開発されたいくつかの Django プロジェクトのソース コードです。

私が不明なことは、リクエストオブジェクトなどをどのように処理するかです。アプリをデプロイした状況があり、開発中または本番環境の Python シェルからでも、本番環境でまったく異なる動作を取得しています。サーバ。いくつかのDoctestsがこれを診断するのに役立ち、最初にテストを書くというよりアジャイルなプロセスへの扉を開くことを願っています.

具体的には、テストしようとしているコードは次のとおりです。

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}) 

index が 10 個のオブジェクトを返すことを保証する Doctest を作成するにはどうすればよいですか?
Product クエリは、実稼働サーバーのシェルから正常に機能しているようです。実際のサーバーは製品をまったく返していません。

4

4 に答える 4

3

私は以前に同じ質問をしました。doctestは、ビュー、モデルメソッド、マネージャーなどの用途が限られていることがわかりました。

  1. 実際にテストに使用するには、テストデータセットをセットアップして破棄できる必要があります
  2. ビューはリクエストオブジェクトを受け取る必要があります。doctestでは、それはどこから来たのですか?

そのため、私は常にこれらすべてを処理するDjangoユニットテストフレームワークを使用してきました。残念ながら、ただし、doctestの利点の一部は得られず、TDD/BDDの実行が困難になります。次に続くのは、これをどのように機能させるかについての純粋な推測です。

それぞれのモジュールと関数からdoctestを取得し、単体テストフレームワーク内で実行したいと思います。これにより、テストデータのセットアップ/ティアダウンが処理されます。doctestが、Djangoのunittest.TestCaseをサブクラス化するテストメソッド内から実行された場合、そのテストDBを使用できるようになります。また、モックリクエストオブジェクトをドキュメントテストの実行コンテキストに渡すこともできます。これは、モックリクエストオブジェクトとその情報を提供するDjangoスニペットです。すべてのアプリケーションビューから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})

繰り返しになりますが、これは私の頭から離れたところにあり、まったくテストされていませんが、すべてのビューテストを単体テストフレームワークに入れることなく、必要なものを実行できると思う唯一の方法です。

于 2009-12-16T20:48:07.577 に答える
1

あなたの見解が書かれている方法では、テストするのは難しいでしょう。必要なコンテンツが存在するかどうかを確認するために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」を返すことを確認してください。

于 2009-12-15T14:46:02.813 に答える
1

django testclientを使用して、設定されたコンテキスト変数をテストできます。

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

応答コードをチェックして、ページが成功を返したことを確認することもできます200

于 2010-01-07T06:02:07.700 に答える
0

実稼働サーバーのレンダリングされた HTML 回答を分析したいので、zope.testbrowserパッケージはdoctests で役立つかもしれません。

于 2009-12-15T14:33:34.897 に答える