开发编程
#python
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 / 自定义框架) |