Bu Makale Dikkatinize Değer: Kaliteli yazılım yazma konusunda tutkulusunuz ve testlerle uygulamanızın kararlılığını artırmak istiyorsunuz. Üretim sistemlerinizde beklenmedik hataların ortaya çıkmasından bıktınız. Otomatik testlerin ne olduğunu ve bunlara nasıl yaklaşılacağını anlama konusunda yardıma ihtiyacınız var. Neden Otomatik Testlere İhtiyaç Duyarız? Mühendisler olarak istiyoruz, ancak yarattığımız her yeni özellik ile kaçınılmaz olarak uygulamalarımızın boyutunu ve karmaşıklığını artırıyoruz. işe yarayan şeyler oluşturmak Ürün büyüdükçe, değişikliklerinizden etkilenen her işlevi olarak (örneğin ellerinizle) test etmek giderek daha fazla zaman alır. manuel Otomatik testlerin yokluğu ya çok fazla zaman harcamamıza ve sevkıyat hızımızı yavaşlatmamıza ya da hızı korumak için çok az harcamamıza yol açıyor, bu da PagerDuty'den gece geç saatlerde yapılan çağrılarla birlikte biriktirilen işlerde yeni hatalara yol açıyor. Tam tersine, . O halde bilgisayarlar aynı şeyi tekrar tekrar yapacak şekilde programlanabilir testi bilgisayarlara devredelim! Test Türleri . Her türe derinlemesine dalalım ve her birine neden ihtiyacımız olduğunu anlayalım. Test piramidi fikri üç ana test türünü önerir: birim, entegrasyon ve uçtan uca Birim Testleri , (diğer bileşenlere güvenmeden) test ettiğiniz küçük bir mantık parçasıdır. Birim ayrı ayrı Saniyeler içinde bitiriyorlar. , bağımlı hizmetleri çalıştırmadan/API ve veritabanı çağrıları yapmadan bunları herhangi bir zamanda yerel olarak ve CI üzerinde çalıştırmalarına olanak tanır. Birim testleri hızlıdır. Yalıtım İki sayıyı kabul eden ve bunları toplayan bir fonksiyon. Bunu farklı argümanlarla çağırmak ve döndürülen değerin doğru olduğunu iddia etmek istiyoruz. Birim testi örneği: // Function "sum" is the unit const sum = (x, y) => x + y test('sums numbers', () => { // Call the function, record the result const result = sum(1, 2); // Assert the result expect(result).toBe(3) }) test('sums numbers', () => { // Call the function, record the result const result = sum(5, 10); // Assert the result expect(result).toBe(15) }) Daha ilginç bir örnek, API isteği bittikten sonra bazı metinleri işleyen React bileşenidir. Testlerimiz için gerekli değerleri döndürmek, bileşeni oluşturmak ve oluşturulan HTML'nin ihtiyacımız olan içeriğe sahip olduğunu iddia etmek için API modülünü taklit etmemiz gerekiyor. // "MyComponent" is the unit const MyComponent = () => { const { isLoading } = apiModule.useSomeApiCall(); return isLoading ? <div>Loading...</div> : <div>Hello world</div> } test('renders loading spinner when loading', () => { // Mocking the API module, so that it returns the value we need jest.mock(apiModule).mockReturnValue(() => ({ useSomeApiCall: jest.fn(() => ({ // Return "isLoading: false" for this test case isLoading: false })) })) // Execute the unit (render the component) const result = render(<MyComponent />) // Assert the result result.findByText('Loading...').toBeInTheDocument() }) test('renders text content when not loading', () => { // Mocking the API module jest.mock(apiModule).mockReturnValue(() => ({ useSomeApiCall: jest.fn(() => ({ // Return "isLoading: false" for this test case isLoading: false })) })) // Execute the unit (render the component) const result = render(<MyComponent />) // Assert the result result.findByText('Hello world').toBeInTheDocument() }) Entegrasyon Testleri diğer etkileşime girdiğinde buna diyoruz. Bu testler birim testlerinden daha yavaştır ancak uygulamanızın bölümlerinin nasıl bağlandığını test ederler. Biriminiz birimlerle (bağımlılıklar) entegrasyon Bir veritabanında kullanıcılar oluşturan bir hizmet. Bu, testler yürütüldüğünde bir veritabanı örneğinin ( ) mevcut olmasını gerektirir. Hizmetin DB'den bir kullanıcı oluşturup alabildiğini test edeceğiz. Entegrasyon testi örneği: bağımlılık import db from 'db' // We will be testing "createUser" and "getUser" const createUser = name => db.createUser(name) // creates a user const getUser = name => db.getUserOrNull(name) // retrieves a user or null test("creates and retrieves users", () => { // Try to get a user that doesn't exist, assert Null is returned const nonExistingUser = getUser("i don't exist") expect(nonExistingUser).toBe(null); // Create a user const userName = "test-user" createUser(userName); // Get the user that was just created, assert it's not Null const user = getUser(userName); expect(user).to.not.be(null) }) Uçtan Uca Testler Bu, tüm bağımlılıklarının mevcut olduğu, test ettiğimiz bir testtir. Bu testler, gerçek kullanıcı davranışını en iyi şekilde simüle eder ve uygulamanızdaki yakalamanıza olanak tanır, ancak bunlar test türüdür. tam olarak konuşlandırılmış uygulamayı uçtan uca olası tüm sorunları en yavaş Uçtan uca testler gerçekleştirmek istediğinizde tüm altyapıyı sağlamalı ve ortamınızda 3. taraf sağlayıcıların bulunduğundan emin olmalısınız. Bunlara uygulamanızın özellikleri için sahip olmak istersiniz. yalnızca kritik görev Oturum açma akışı. Uygulamaya gitmek, giriş bilgilerini doldurmak, göndermek ve hoş geldiniz mesajını görmek istiyoruz. Uçtan uca bir test örneğine bakalım: test('user can log in', () => { // Visit the login page page.goto('https://example.com/login'); // Fill in the login form page.fill('#username', 'john'); page.fill('#password', 'some-password'); // Click the login button page.click('#login-button'); // Assert the welcome message is visible page.assertTextVisible('Welcome, John!') }) Ne Tür Test Yazacağınızı Nasıl Seçersiniz? , unutmayın. Uçtan uca testlerin entegrasyondan entegrasyon testlerinin ise birim testlerden daha yavaş olduğunu Üzerinde çalıştığınız özellik kritik bir görevse, en az bir test yazmayı düşünün (Kimlik Doğrulama akışını geliştirirken Oturum Açma işlevinin nasıl çalıştığını kontrol etmek gibi). uçtan uca Görev açısından kritik akışların yanı sıra, mümkün olduğunca çok sayıda uç durumu ve özelliğin çeşitli durumlarını test etmek istiyoruz. uygulamanın parçalarının birlikte nasıl çalıştığını test etmemizi sağlar. Entegrasyon testleri, Uç noktaların işlemleri gerçekleştirmesi, beklenen sonucu üretmesi ve beklenmeyen hatalar vermemesi gerekir. Uç noktalar ve istemci bileşenleri için entegrasyon testlerinin yapılması iyi bir fikirdir. İstemci bileşenleri doğru içeriği görüntülemeli ve kullanıcı etkileşimlerine, onlardan beklediğiniz şekilde yanıt vermelidir. Ve son olarak ne zaman seçmeliyiz? Sayıları toplayan , etiketini oluşturan gibi ayrı ayrı test edilebilecek tüm küçük işlevler, birim testleri için mükemmel adaylardır. yaklaşımını izlerseniz birimler mükemmeldir. birim testlerini sum <button> Button Test Odaklı Geliştirme Sıradaki ne? (ama küçük başlayın) Bazı testler yazın! Projenize/diline uygun . Her dilin test için popüler bir kütüphanesi vardır; örneğin JavaScript için / , uçtan uca için / (JavaScript de kullanır), Java için vb. bir test çerçevesi kurun Jest Vitest Cypress Playwright JUnit Projenizde küçük bir fonksiyon bulun ve bunun için bir testi yazın. birim Bazı bileşen/hizmet-veritabanı etkileşimi için bir testi yazın. entegrasyon Basit bir oturum açma akışı gibi hızlı bir şekilde test edilebilecek kritik bir senaryo seçin ve bunun için bir test yazın. uçtan uca Nasıl çalıştığını anlamak için yukarıdaki işlemleri bir kez yapın. Daha sonra bazı özellik/hata çalışmaları sırasında bunu tekrar yapın. Daha sonra bunu iş arkadaşlarınızla paylaşın, böylece hepiniz testler yazabilir, zamandan tasarruf edebilir ve geceleri daha iyi uyuyabilirsiniz! Yararlı Kaynaklar: Kişisel blogum Ham Vocke'un Pratik Test Piramidi , Test Odaklı Geliştirme Martin Fowler