Skills Plugins MCP Prompt Model 博客 我的中心
开发编程 #api #testing

django-tdd

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

DeepseekModel 官方收录技能 质量 优秀 · 90 v1.0.0

获取

https://deepseekmodel.com/api/download.php?id=affaan-m-ecc-docs-ja-jp-skills-django-tdd-skill-md&format=skill
下载 .skill 标准格式,含 system_prompt 与 model_config,导入任意 Agent 框架即可使用
.skill 文件中 system_prompt 字段的实际内容。
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()
Agent 识别该技能的关键词,点击任意一个即可复制。

该技能未提供触发词。

下载的 .skill 包内含以下字段。
字段 说明
format格式标识(skill/v1)
skill_id技能唯一 ID
name技能名称
version版本号
description技能描述
category所属分类(数组)
trigger_words触发词列表
tags标签列表
source来源标识
source_url来源链接(本页地址)
exported_at导出时间(每次下载生成)
system_prompt系统提示词正文
model_config模型参数:provider / model / temperature / max_tokens / top_p
examples示例
install_guide各平台导入说明(Coze / Dify / Claude / 自定义框架)
同一份技能可按不同平台格式导出。
.skill 标准格式,含 system_prompt 与 model_config,导入任意 Agent 框架即可使用 下载
.skillpro 增强格式,额外含脚本 / 工具 / 依赖 / 钩子占位 下载
.json 纯 JSON 导出,只含 system_prompt 与模型参数 下载
Coze 带 frontmatter 的 Markdown,Coze 平台导入用 下载
Dify Dify DSL,创建应用后直接导入 下载

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

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

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

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