Ana içeriğe geç

Test Etme

Connect for Node.js uygulamanız için test yazarken, yaklaşımınız istemcileri veya arka uç hizmetlerini test edip etmemeye bağlı olarak değişecektir. Her biri için kurulumda benzerlikler yanı sıra avantajlar ve dezavantajlar bulunmaktadır. Aşağıda, her ikisini de test etme için birkaç teknik listeleyeceğiz.

İstemciler

Connect for Node.js istemcilerinizi test etme süreci, istemcinin beklenen istekleri gönderip çeşitli yanıtlara doğru tepki verip vermediğini doğrulamayı içerir. Dolayısıyla, istemcileriniz için test yazarken, testleriniz sırasında etkileşimde bulunmak için bir sunucu tanımlamanız gerekecektir.

Çalışan bir sunucuya karşı test etme

Bu yaklaşımda, TCP üzerinde tam bir HTTP sunucusu çalıştırabilir ve testteki istemcilerinizi prosedürleri çağırmak için kullanarak sonuçların beklentilerle eşleştiğini doğrulayabilirsiniz. Büyük yarar, gerçek dağıtıma en yakın davranışı alıyorsunuz. Bu, bir üretim dağıtımına en yakın olmanızı sağlar ve sunucunuzun etkileşime girebileceği diğer süreçleri test etmeyi de içerir; middleware dahil. Büyük dezavantajı ise, testleriniz için çalışan bir sunucu kurmak için çok fazla çaba gerektirmesidir.

Bellek içi sunucuya karşı test etme

Bellek içi bir sunucu ile, Connect istemcilerinizi bir rotaya karşı izole şekilde test edebilir ve sunucunuzun devreye alabileceği diğer rotaları veya middleware'i geçersiz kılabilirsiniz. Bunu başarmak için @connectrpc/connect paketinden dışa aktarılan createRouterTransport fonksiyonunu kullanabilirsiniz. Bu bellek içi taşıma, ağ üzerinde HTTP istekleri yapmayan, ancak verilen Connect rotalarını doğrudan çağıran özel bir taşımadır. createRouterTransport işlevinden dönen Transport, istemciler oluşturmak ve prosedürleri çağırmak için kullanılabilir ve sonuçların beklentilerle eşleştiğini doğrulayabilirsiniz.

ipucu

Bellek içi sunucuya karşı istemcileri test etmenin faydalarından biri kurulumun kolaylığıdır. Örneğin, istek ve yanıt mesajları serileştirilir. Başlıklar, trailerlar, hatalar ve diğer Connect özellikleri de desteklenir. Ancak, test edilen davranış gerçek bir dağıtım kadar yakın değildir. İstekler ağa gitmediği için, testin içinde hesaba katılmayan birçok alan vardır ve bu, istemci kapsamanızın tamlığı hakkında yanıltıcı bir güven duygusuna neden olabilir.

Hizmetleri taklit etme

Gerçek bir API'ye karşı test etmenin her zaman mümkün veya arzu edilir olmadığı durumlar olabilir. Örneğin, her zaman bir hata döndüren veya her zaman boş bir yanıt döndüren belirli durumları sabit kodlamış bir test rotası yazmak isteyebilirsiniz. Bu gibi durumlarda, Connect'in createRouterTransport fonksiyonunu kullanarak uygulamanızı tekrar test etmek için sahte bir Connect arka ucu kullanabilirsiniz.

Bahsedildiği gibi, @connectrpc/connect paketinden createRouterTransport fonksiyonu sağlanan rotalarla bellek içi bir sunucu oluşturur. Böylece, yalnızca test amaçları için kendi RPC uygulamalarınızı sağlayabilirsiniz.

Basit bir ELIZA hizmeti kurmak için:

import { ElizaService } from "@buf/connectrpc_eliza.bufbuild_es/connectrpc/eliza/v1/eliza_pb";
import { createRouterTransport } from "@connectrpc/connect";

const mockTransport = createRouterTransport(({ service }) => {
service(ElizaService, {
say: () => ({ sentence: "Mutlu hissediyorum." }),
});
});

Arka planda, bu sahte taşıma, Node.js üzerinde çalışan bir sunucuda çalışacak olan hemen hemen aynı kodu çalıştırır. Bu, gerçek hizmetleri uygulama ile tüm özelliklerin kullanılabilir olduğu anlamına gelir: İstek başlıklarına erişebilir, ayrıntılı hatalar yükseltebilir ve ayrıca akış yanıtlarını da sahteleyebilirsiniz. Dördüncü istek üzerine hata yükselten bir örnek:

const mockTransport = createRouterTransport(({ service }) => {
const sentences: string[] = [];
service(ElizaService, {
say(request: SayRequest) {
sentences.push(request.sentence);
if (sentences.length > 3) {
throw new ConnectError(
"Artık kelimem kalmadı.",
Code.ResourceExhausted,
);
}
return new SayResponse({
sentence: `Toplam ${sentences.length} cümle söylediniz.`,
});
},
});
});

Bu sahte ile, istemcinin ardışık yanıtlar sonrası dönen hatalara nasıl tepki vereceğini test edebilirsiniz. Ayrıca, istemcinin istekleri beklenen şekilde gönderdiğini doğrulamak için beklentiler kullanabilirsiniz:

const mockTransport = createRouterTransport(({ service }) => {
service(ElizaService, {
say(request) {
expect(request.sentence).toBe("nasıl hissediyorsun?");
return new SayResponse({ sentence: "Mutlu hissediyorum." });
},
});
});

createRouterTransport fonksiyonu ayrıca, interceptors gibi seçenekler geçmenizi sağlayan isteğe bağlı bir ikinci argümanı da kabul eder.

Örnekler

Vanilla Node.js'de tüm bu üç yaklaşım için çalışan bir örnek için client.test.ts dosyasını vanilla-node projesinde bulunan examples-es repomuzda inceleyebilirsiniz.

Hizmetler

İstemcilerde olduğu gibi, Connect-Node hizmetlerinizi test etmenin çeşitli yolları vardır ve her birinin avantajları vardır. Yaklaşımlar, hangi şeyi test ettiğiniz dışında, istemcilerdekiyle aynı kavramları takip eder.

Çalışan bir sunucu ile test etme

Bu yaklaşım, yukarıda açıklanan çalışan bir sunucu kullanma ile aynı kavramdır. Bu yaklaşımla, test istemcileri kurarak çeşitli istek konfigürasyonları gönderebilir ve rotalarınızın planlandığı gibi çalıştığını doğrulayabilirsiniz. Bu yaklaşım, düz Node.js, Fastify ve Express ile iyi çalışır.

not

fastify.inject() ile Connect rotalarını test etmenizi önermiyoruz. fastify.inject() harika bir araçtır, ancak bunu kullanmak, Content-Type başlıkları ve durum kodları gibi protokol ayrıntılarını kendiniz yönetmeniz gerektiği anlamına gelir. Bu, Connect unary için oldukça basittir, ancak akış RPC'leri veya gRPC ya da gRPC-Web protokolleri için çok daha azdır.

Bellek içi sunucu ile test etme

Aynı şekilde, bu yukarıda belirtilen istemci karşılığı ile aynı kavramı izler. Amaç, yan hizmetler veya middleware'leri göz önünde bulundurmadan rotalarınızı izole bir şekilde test etmektir. Kurulum yukarıdaki gibidir ve createRouterTransport kullanılarak kolaylaştırılabilir.

Bu yaklaşım, Next.js ile iyi çalışır; çünkü testlerde tam bir sunucu başlatmak kolay değildir.

Bir hizmete birim testi

Bir hizmetin birim testi, TCP ve HTTP'yi tamamen atlar ve hizmet yöntemlerini doğrudan çağırır, istemcilere, taşımalara ve gerçek bir sunucu ile etkileşimde kullanılan diğer süreçlere gerek duymadan. Bu yöntem birim testi için idealdir, ancak hizmetlerinizi yardımcı türler kullanarak sınıflar olarak uygulamanızı gerektirir. Bu sayede, hizmet sınıfınızı doğrudan örneklendirip, yöntemleri doğrudan çağırabilirsiniz.

Örnekler

examples-es repomuz, Fastify, Express ve vanilla Node.js için tüm üç yaklaşım için örnekler sunmaktadır.

Ayrıca, Next.js projesini inceleyerek bellek içi sunucu ile test etme ve hizmet yöntemlerini doğrudan birim test etme örneğine bakabilirsiniz.