Skills Plugins MCP Prompt Model 博客 我的中心
Development #api #testing

django-tdd

Django testing strategies with pytest-django, TDD methodology, factory_boy, mocking, coverage, and testing Django REST Framework APIs.

DeepseekModel Curated skill Quality Excellent · 90 v1.0.0

Get

https://deepseekmodel.com/api/download.php?id=affaan-m-ecc-docs-ja-jp-skills-django-tdd-skill-md&format=skill
Download .skill Standard format with system_prompt and model_config, ready for any agent framework
The actual content of the system_prompt field in the .skill file.
name django-tdd description Django testing strategies with pytest-django, TDD methodology, factory_boy, mocking, coverage, and testing Django REST Framework APIs. Django テスト駆動開発(TDD) pytest、factory_boy、Django REST Frameworkを使用したDjangoアプリケーションのテスト駆動開発。 いつ有効化するか 新しいDjangoアプリケーションを書くとき Django REST Framework APIを実装するとき Djangoモデル、ビュー、シリアライザーをテストするとき Djangoプロジェクトのテストインフラを設定するとき DjangoのためのTDDワークフロー Red-Green-Refactorサイクル # ステップ1: RED - 失敗するテストを書く def test_user_creation (): user = User.objects.create_user(email= 'test@example.com' , password= 'testpass123' ) assert user.email == 'test@example.com' assert user.check_password( 'testpass123' ) assert not user.is_staff # ステップ2: GREEN - テストを通す # Userモデルまたはファクトリーを作成 # ステップ3: REFACTOR - テストをグリーンに保ちながら改善 セットアップ pytest設定 # pytest.ini [pytest] DJANGO_SETTINGS_MODULE = config.settings.test testpaths = tests python_files = test_*.py python_classes = Test* python_functions = test_* addopts = --reuse-db --nomigrations --cov =apps --cov-report =html --cov-report =term-missing --strict-markers markers = slow: marks tests as slow integration: marks tests as integration tests テスト設定 # config/settings/test.py from .base import * DEBUG = True DATABASES = { 'default' : { 'ENGINE' : 'django.db.backends.sqlite3' , 'NAME' : ':memory:' , } } # マイグレーションを無効化して高速化 class DisableMigrations : def __contains__ ( self, item ): return True def __getitem__ ( self, item ): return None MIGRATION_MODULES = DisableMigrations() # より高速なパスワードハッシング PASSWORD_HASHERS = [ 'django.contrib.auth.hashers.MD5PasswordHasher' , ] # メールバックエンド EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend' # Celeryは常にeager CELERY_TASK_ALWAYS_EAGER = True CELERY_TASK_EAGER_PROPAGATES = True conftest.py # tests/conftest.py import pytest from django.utils import timezone from django.contrib.auth import get_user_model User = get_user_model() @pytest.fixture( autouse= True ) def timezone_settings ( settings ): """一貫したタイムゾーンを確保。""" settings.TIME_ZONE = 'UTC' @pytest.fixture def user ( db ): """テストユーザーを作成。""" return User.objects.create_user( email= 'test@example.com' , password= 'testpass123' , username= 'testuser' ) @pytest.fixture def admin_user ( db ): """管理者ユーザーを作成。""" return User.objects.create_superuser( email= 'admin@example.com' , password= 'adminpass123' , username= 'admin' ) @pytest.fixture def authenticated_client ( client, user ): """認証済みクライアントを返す。""" client.force_login(user) return client @pytest.fixture def api_client (): """DRF APIクライアントを返す。""" from rest_framework.test import APIClient return APIClient() @pytest.fixture def authenticated_api_client ( api_client, user ): """認証済みAPIクライアントを返す。""" api_client.force_authenticate(user=user) return api_client Factory Boy ファクトリーセットアップ # tests/factories.py import factory from factory import fuzzy from datetime import datetime, timedelta from django.contrib.auth import get_user_model from apps.products.models import Product, Category User = get_user_model() class UserFactory (factory.django.DjangoModelFactory): """Userモデルのファクトリー。""" class Meta : model = User email = factory. Sequence ( lambda n: f"user {n} @example.com" ) username = factory. Sequence ( lambda n: f"user {n} " ) password = factory.PostGenerationMethodCall( 'set_password' , 'testpass123' ) first_name = factory.Faker( 'first_name' ) last_name = factory.Faker( 'last_name' ) is_active = True class CategoryFactory (factory.django.DjangoModelFactory): """Categoryモデルのファクトリー。""" class Meta : model = Category name = factory.Faker( 'word' ) slug = factory.LazyAttribute( lambda obj: obj.name.lower()) description = factory.Faker( 'text' ) class ProductFactory (factory.django.DjangoModelFactory): """Productモデルのファクトリー。""" class Meta : model = Product name = factory.Faker( 'sentence' , nb_words= 3 ) slug = factory.LazyAttribute( lambda obj: obj.name.lower().replace( ' ' , '-' )) description = factory.Faker( 'text' ) price = fuzzy.FuzzyDecimal( 10.00 , 1000.00 , 2 ) stock = fuzzy.FuzzyInteger( 0 , 100 ) is_active = True category = factory.SubFactory(CategoryFactory) created_by = factory.SubFactory(UserFactory) @factory.post_generation def tags ( self, create, extracted, **kwargs ): """製品にタグを追加。""" if not create: return if extracted: for tag in extracted: self .tags.add(tag) ファクトリーの使用 # tests/test_models.py import pytest from tests.factories import ProductFactory, UserFactory def test_product_creation (): """ファクトリーを使用した製品作成をテスト。""" product = ProductFactory(price= 100.00 , stock= 50 ) assert product.price == 100.00 assert product.stock == 50 assert product.is_active is True def test_product_with_tags (): """タグ付き製品をテスト。""" tags = [TagFactory(name= 'electronics' ), TagFactory(name= 'new' )] product = ProductFactory(tags=tags) assert product.tags.count() == 2 def test_multiple_products (): """複数の製品作成をテスト。""" products = ProductFactory.create_batch( 10 ) assert len (products) == 10 モデルテスト モデルテスト # tests/test_models.py import pytest from django.core.exceptions import ValidationError from tests.factories import UserFactory, ProductFactory class TestUserModel : """Userモデルをテスト。""" def test_create_user ( self, db ): """通常のユーザー作成をテスト。""" user = UserFactory(email= 'test@example.com' ) assert user.email == 'test@example.com' assert user.check_password( 'testpass123' ) assert not user.is_staff assert not user.is_superuser def test_create_superuser ( self, db ): """スーパーユーザー作成をテスト。""" user = UserFactory( email= 'admin@example.com' , is_staff= True , is_superuser= True ) assert user.is_staff assert user.is_superuser def test_user_str ( self, db ): """ユーザーの文字列表現をテスト。""" user = UserFactory(email= 'test@example.com' ) assert str (user) == 'test@example.com' class TestProductModel : """Productモデルをテスト。""" def test_product_creation ( self, db ): """製品作成をテスト。""" product = ProductFactory() assert product. id is not None assert product.is_active is True assert product.created_at is not None def test_product_slug_generation ( self, db ): """自動スラッグ生成をテスト。""" product = ProductFactory(name= 'Test Product' ) assert product.slug == 'test-product' def test_product_price_validation ( self, db ): """価格が負の値にならないことをテスト。""" product = ProductFactory(price=- 10 ) with pytest.raises(ValidationError): product.full_clean() def test_product_manager_active ( self, db ): """アクティブマネージャーメソッドをテスト。""" ProductFactory.create_batch( 5 , is_active= True ) ProductFactory.create_batch( 3 , is_active= False ) active_count = Product.objects.active().count() assert active_count == 5 def test_product_stock_management ( self, db ): """在庫管理をテスト。""" product = ProductFactory(stock= 10 ) product.reduce_stock( 5 ) product.refresh_from_db() assert product.stock == 5 with pytest.raises(ValueError): product.reduce_stock( 10 ) # 在庫不足 ビューテスト Djangoビューテスト # tests/test_views.py import pytest from django.urls import reverse from tests.factories import ProductFactory, UserFactory class TestProductViews : """製品ビューをテスト。""" def test_product_list ( self, client, db ): """製品リストビューをテスト。""" ProductFactory.create_batch( 10 ) response = client.get(reverse( 'products:list' )) assert response.status_code == 200 assert len (response.context[ 'products' ]) == 10 def test_product_detail ( self, client, db ): """製品詳細ビューをテスト。""" product = ProductFactory() response = client.get(reverse( 'products:detail' , kwargs={ 'slug' : product.slug})) assert response.status_code == 200 assert response.context[ 'product' ] == product def test_product_create_requires_login ( self, client, db ): """製品作成に認証が必要であることをテスト。""" response = client.get(reverse( 'products:create' )) assert response.status_code == 302 assert response.url.startswith( '/accounts/login/' ) def test_product_create_authenticated ( self, authenticated_client, db ): """認証済みユーザーとしての製品作成をテスト。""" response = authenticated_client.get(reverse( 'products:create' )) assert response.status_code == 200 def test_product_create_post ( self, authenticated_client, db, category ): """POSTによる製品作成をテスト。""" data = { 'name' : 'Test Product' , 'description' : 'A test product' , 'price' : '99.99' , 'stock' : 10 , 'category' : category. id , } response = authenticated_client.post(reverse( 'products:create' ), data) assert response.status_code == 302 assert Product.objects. filter (name= 'Test Product' ).exists() DRF APIテスト シリアライザーテスト # tests/test_serializers.py import pytest from rest_framework.exceptions import ValidationError from apps.products.serializers import ProductSerializer from tests.factories import ProductFactory class TestProductSerializer : """ProductSerializerをテスト。""" def test_serialize_product ( self, db ): """製品のシリアライズをテスト。""" product = ProductFactory() serializer = ProductSerializer(product) data = serializer.data assert data[ 'id' ] == product. id assert data[ 'name' ] == product.name assert data[ 'price' ] == str (product.price) def test_deserialize_product ( self, db ): """製品データのデシリアライズをテスト。""" data = { 'name' : 'Test Product' , 'description' : 'Test description' , 'price' : '99.99' , 'stock' : 10 , 'category' : 1 , } serializer = ProductSerializer(data=data) assert serializer.is_valid() product = serializer.save() assert product.name == 'Test Product' assert float (product.price) == 99.99 def test_price_validation ( self, db ): """価格検証をテスト。""" data = { 'name' : 'Test Product' , 'price' : '-10.00' , 'stock' : 10 , } serializer = ProductSerializer(data=data) assert not serializer.is_valid() assert 'price' in serializer.errors def test_stock_validation ( self, db ): """在庫が負にならないことをテスト。""" data = { 'name' : 'Test Product' , 'price' : '99.99' , 'stock' : - 5 , } serializer = ProductSerializer(data=data) assert not serializer.is_valid() assert 'stock' in serializer.errors API ViewSetテスト # tests/test_api.py import pytest from rest_framework.test import APIClient from rest_framework import status from django.urls import reverse from tests.factories import ProductFactory, UserFactory class TestProductAPI : """Product APIエンドポイントをテスト。""" @pytest.fixture def api_client ( self ): """APIクライアントを返す。""" return APIClient() def test_list_products ( self, api_client, db ): """製品リストをテスト。""" ProductFactory.create_batch( 10 ) url = reverse( 'api:product-list' ) response = api_client.get(url) assert response.status_code == status.HTTP_200_OK assert response.data[ 'count' ] == 10 def test_retrieve_product ( self, api_client, db ): """製品取得をテスト。""" product = ProductFactory()
Keywords that activate this skill. Click one to copy it.

This skill does not provide trigger words.

The downloaded .skill package contains the following fields.
Field Description
formatFormat tag (skill/v1)
skill_idUnique skill ID
nameSkill name
versionVersion
descriptionDescription
categoryCategories (array)
trigger_wordsTrigger words
tagsTags
sourceSource
source_urlSource URL (this page)
exported_atExported at (set per download)
system_promptSystem prompt body
model_configModel config: provider / model / temperature / max_tokens / top_p
examplesExamples
install_guideImport guide for Coze / Dify / Claude / custom frameworks
The same skill can be exported in different platform formats.
.skill Standard format with system_prompt and model_config, ready for any agent framework Download
.skillpro Enhanced format with scripts, tools, dependencies and hooks Download
.json Plain JSON export with system_prompt and model parameters only Download
Coze Markdown with frontmatter, for Coze platform import Download
Dify Dify DSL, import directly after creating an app Download

每日精选 Skill 推荐,免费送到你邮箱

输入邮箱,每天接收一个精选 AI Agent 技能推荐。完全免费,持续更新。

提交后我们会发送一封确认邮件,点击邮件里的链接才会开始收信。

完全免费,取消任意时间。我们不会发送垃圾邮件。