Skills Plugins MCP Prompt Model 博客 我的中心

python-testing

pytest, TDD metodolojisi, fixture'lar, mocking, parametrizasyon ve coverage gereksinimleri kullanarak Python test stratejileri.

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

获取

https://deepseekmodel.com/api/download.php?id=affaan-m-ecc-docs-tr-skills-python-testing-skill-md&format=skill
下载 .skill 标准格式,含 system_prompt 与 model_config,导入任意 Agent 框架即可使用
.skill 文件中 system_prompt 字段的实际内容。
name python-testing description pytest, TDD metodolojisi, fixture'lar, mocking, parametrizasyon ve coverage gereksinimleri kullanarak Python test stratejileri. origin ECC Python Test Desenleri pytest, TDD metodolojisi ve en iyi uygulamalar kullanarak Python uygulamaları için kapsamlı test stratejileri. Ne Zaman Etkinleştirmeli Yeni Python kodu yazarken (TDD'yi takip et: red, green, refactor) Python projeleri için test suite'leri tasarlarken Python test coverage'ını gözden geçirirken Test altyapısını kurarken Temel Test Felsefesi Test-Driven Development (TDD) Her zaman TDD döngüsünü takip edin: RED : İstenen davranış için başarısız bir test yaz GREEN : Testi geçirmek için minimal kod yaz REFACTOR : Testleri yeşil tutarken kodu iyileştir # Adım 1: Başarısız test yaz (RED) def test_add_numbers (): result = add( 2 , 3 ) assert result == 5 # Adım 2: Minimal implementasyon yaz (GREEN) def add ( a, b ): return a + b # Adım 3: Gerekirse refactor et (REFACTOR) Coverage Gereksinimleri Hedef : 80%+ kod coverage'ı Kritik yollar : 100% coverage gereklidir Coverage'ı ölçmek için pytest --cov kullanın pytest --cov=mypackage --cov-report=term-missing --cov-report=html pytest Temelleri Temel Test Yapısı import pytest def test_addition (): """Temel toplama testi.""" assert 2 + 2 == 4 def test_string_uppercase (): """String büyük harf yapma testi.""" text = "hello" assert text.upper() == "HELLO" def test_list_append (): """Liste append testi.""" items = [ 1 , 2 , 3 ] items.append( 4 ) assert 4 in items assert len (items) == 4 Assertion'lar # Eşitlik assert result == expected # Eşitsizlik assert result != unexpected # Doğruluk değeri assert result # Truthy assert not result # Falsy assert result is True # Tam olarak True assert result is False # Tam olarak False assert result is None # Tam olarak None # Üyelik assert item in collection assert item not in collection # Karşılaştırmalar assert result > 0 assert 0 <= result <= 100 # Tip kontrolü assert isinstance (result, str ) # Exception testi (tercih edilen yaklaşım) with pytest.raises(ValueError): raise ValueError( "error message" ) # Exception mesajını kontrol et with pytest.raises(ValueError, match = "invalid input" ): raise ValueError( "invalid input provided" ) # Exception niteliklerini kontrol et with pytest.raises(ValueError) as exc_info: raise ValueError( "error message" ) assert str (exc_info.value) == "error message" Fixture'lar Temel Fixture Kullanımı import pytest @pytest.fixture def sample_data (): """Örnek veri sağlayan fixture.""" return { "name" : "Alice" , "age" : 30 } def test_sample_data ( sample_data ): """Fixture kullanan test.""" assert sample_data[ "name" ] == "Alice" assert sample_data[ "age" ] == 30 Setup/Teardown ile Fixture @pytest.fixture def database (): """Setup ve teardown ile fixture.""" # Setup db = Database( ":memory:" ) db.create_tables() db.insert_test_data() yield db # Teste sağla # Teardown db.close() def test_database_query ( database ): """Veritabanı operasyonlarını test et.""" result = database.query( "SELECT * FROM users" ) assert len (result) > 0 Fixture Scope'ları # Function scope (varsayılan) - her test için çalışır @pytest.fixture def temp_file (): with open ( "temp.txt" , "w" ) as f: yield f os.remove( "temp.txt" ) # Module scope - modül başına bir kez çalışır @pytest.fixture( scope= "module" ) def module_db (): db = Database( ":memory:" ) db.create_tables() yield db db.close() # Session scope - test oturumu başına bir kez çalışır @pytest.fixture( scope= "session" ) def shared_resource (): resource = ExpensiveResource() yield resource resource.cleanup() Parametreli Fixture @pytest.fixture( params=[ 1 , 2 , 3 ] ) def number ( request ): """Parametreli fixture.""" return request.param def test_numbers ( number ): """Test her parametre için 3 kez çalışır.""" assert number > 0 Birden Fazla Fixture Kullanma @pytest.fixture def user (): return User( id = 1 , name= "Alice" ) @pytest.fixture def admin (): return User( id = 2 , name= "Admin" , role= "admin" ) def test_user_admin_interaction ( user, admin ): """Birden fazla fixture kullanan test.""" assert admin.can_manage(user) Autouse Fixture'ları @pytest.fixture( autouse= True ) def reset_config (): """Her testten önce otomatik olarak çalışır.""" Config.reset() yield Config.cleanup() def test_without_fixture_call (): # reset_config otomatik olarak çalışır assert Config.get_setting( "debug" ) is False Paylaşılan Fixture'lar için Conftest.py # tests/conftest.py import pytest @pytest.fixture def client (): """Tüm testler için paylaşılan fixture.""" app = create_app(testing= True ) with app.test_client() as client: yield client @pytest.fixture def auth_headers ( client ): """API testi için auth header'ları oluştur.""" response = client.post( "/api/login" , json={ "username" : "test" , "password" : "test" }) token = response.json[ "token" ] return { "Authorization" : f"Bearer {token} " } Parametrizasyon Temel Parametrizasyon @pytest.mark.parametrize( "input,expected" , [ ( "hello" , "HELLO" ), ( "world" , "WORLD" ), ( "PyThOn" , "PYTHON" ), ] ) def test_uppercase ( input , expected ): """Test farklı input'larla 3 kez çalışır.""" assert input .upper() == expected Birden Fazla Parametre @pytest.mark.parametrize( "a,b,expected" , [ ( 2 , 3 , 5 ), ( 0 , 0 , 0 ), ( - 1 , 1 , 0 ), ( 100 , 200 , 300 ), ] ) def test_add ( a, b, expected ): """Birden fazla input ile toplama testi.""" assert add(a, b) == expected ID'li Parametrizasyon @pytest.mark.parametrize( "input,expected" , [ ( "valid@email.com" , True ), ( "invalid" , False ), ( "@no-domain.com" , False ), ], ids=[ "valid-email" , "missing-at" , "missing-domain" ] ) def test_email_validation ( input , expected ): """Okunabilir test ID'leri ile email validation testi.""" assert is_valid_email( input ) is expected Parametreli Fixture'lar @pytest.fixture( params=[ "sqlite" , "postgresql" , "mysql" ] ) def db ( request ): """Birden fazla veritabanı backend'ine karşı test.""" if request.param == "sqlite" : return Database( ":memory:" ) elif request.param == "postgresql" : return Database( "postgresql://localhost/test" ) elif request.param == "mysql" : return Database( "mysql://localhost/test" ) def test_database_operations ( db ): """Test her veritabanı için 3 kez çalışır.""" result = db.query( "SELECT 1" ) assert result is not None Marker'lar ve Test Seçimi Özel Marker'lar # Yavaş testleri işaretle @pytest.mark.slow def test_slow_operation (): time.sleep( 5 ) # Entegrasyon testlerini işaretle @pytest.mark.integration def test_api_integration (): response = requests.get( "https://api.example.com" ) assert response.status_code == 200 # Unit testleri işaretle @pytest.mark.unit def test_unit_logic (): assert calculate( 2 , 3 ) == 5 Belirli Testleri Çalıştırma # Sadece hızlı testleri çalıştır pytest -m "not slow" # Sadece entegrasyon testlerini çalıştır pytest -m integration # Entegrasyon veya yavaş testleri çalıştır pytest -m "integration or slow" # Unit olarak işaretlenmiş ama yavaş olmayan testleri çalıştır pytest -m "unit and not slow" pytest.ini'de Marker'ları Yapılandırma [pytest] markers = slow: marks tests as slow integration: marks tests as integration tests unit: marks tests as unit tests django: marks tests as requiring Django Mocking ve Patching Fonksiyonları Mocking from unittest.mock import patch, Mock @patch( "mypackage.external_api_call" ) def test_with_mock ( api_call_mock ): """Mock'lanmış harici API ile test.""" api_call_mock.return_value = { "status" : "success" } result = my_function() api_call_mock.assert_called_once() assert result[ "status" ] == "success" Dönüş Değerlerini Mocking @patch( "mypackage.Database.connect" ) def test_database_connection ( connect_mock ): """Mock'lanmış veritabanı bağlantısı ile test.""" connect_mock.return_value = MockConnection() db = Database() db.connect() connect_mock.assert_called_once_with( "localhost" ) Exception'ları Mocking @patch( "mypackage.api_call" ) def test_api_error_handling ( api_call_mock ): """Mock'lanmış exception ile hata işleme testi.""" api_call_mock.side_effect = ConnectionError( "Network error" ) with pytest.raises(ConnectionError): api_call() api_call_mock.assert_called_once() Context Manager'ları Mocking @patch( "builtins.open" , new_callable=mock_open ) def test_file_reading ( mock_file ): """Mock'lanmış open ile dosya okuma testi.""" mock_file.return_value.read.return_value = "file content" result = read_file( "test.txt" ) mock_file.assert_called_once_with( "test.txt" , "r" ) assert result == "file content" Autospec Kullanma @patch( "mypackage.DBConnection" , autospec= True ) def test_autospec ( db_mock ): """API yanlış kullanımını yakalamak için autospec ile test.""" db = db_mock.return_value db.query( "SELECT * FROM users" ) # DBConnection query metodu yoksa bu başarısız olur db_mock.assert_called_once() Mock Class Instance'ları class TestUserService : @patch( "mypackage.UserRepository" ) def test_create_user ( self, repo_mock ): """Mock'lanmış repository ile kullanıcı oluşturma testi.""" repo_mock.return_value.save.return_value = User( id = 1 , name= "Alice" ) service = UserService(repo_mock.return_value) user = service.create_user(name= "Alice" ) assert user.name == "Alice" repo_mock.return_value.save.assert_called_once() Mock Property @pytest.fixture def mock_config (): """Property'li bir mock oluştur.""" config = Mock() type (config).debug = PropertyMock(return_value= True ) type (config).api_key = PropertyMock(return_value= "test-key" ) return config def test_with_mock_config ( mock_config ): """Mock'lanmış config property'leri ile test.""" assert mock_config.debug is True assert mock_config.api_key == "test-key"
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 技能推荐。完全免费,持续更新。

验证码 --

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

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