Raporlayıcıları Genişletme
Özel raporlayıcılarınızı oluşturmak için vitest/reporters
modülünden raporlayıcıları içe aktarabilir ve bunları genişletebilirsiniz.
Yerleşik Raporlayıcıları Genişletme
Genellikle, raporlayıcınızı sıfırdan oluşturmanız gerekmez. vitest
, genişletebileceğiniz birkaç varsayılan raporlama sınıfıyla birlikte gelir.
import { DefaultReporter } from 'vitest/reporters';
export default class MyDefaultReporter extends DefaultReporter {
// yapılacak işlemler
}
Elbette, raporlayıcınızı sıfırdan da oluşturabilirsiniz; sadece BaseReporter
sınıfını genişletip ihtiyacınız olan yöntemleri uygulamanız yeterlidir.
İşte özel bir raporlayıcı örneği:
// ./custom-reporter.js
import { BaseReporter } from 'vitest/reporters';
export default class CustomReporter extends BaseReporter {
onCollected() {
const files = this.ctx.state.getFiles(this.watchFilters);
this.reportTestSummary(files);
}
}
Veya Reporter
arayüzünü uygulayın:
// ./custom-reporter.js
import { Reporter } from 'vitest/reporters';
export default class CustomReporter implements Reporter {
onCollected() {
// bir şeyler yazdırın
}
}
Daha sonra özel raporlayıcınızı vitest.config.ts
dosyasında kullanabilirsiniz:
import { defineConfig } from 'vitest/config';
import CustomReporter from './custom-reporter.js';
export default defineConfig({
test: {
reporters: [new CustomReporter()],
},
});
Raporlanan Görevler
WARNING
Bu deneysel bir API'dır. Geriye dönük uyumsuz değişiklikler SemVer'i takip etmeyebilir. Lütfen kullanırken Vitest'in sürümünü sabitleyin.
Bu API'ye vitest.state.getReportedEntity(runnerTask)
çağrısı yaparak erişim sağlayabilirsiniz:
import type { Vitest } from 'vitest/node';
import type { RunnerTestFile } from 'vitest';
import type { Reporter, TestModule } from 'vitest/reporters';
class MyReporter implements Reporter {
ctx!: Vitest;
onInit(ctx: Vitest) {
this.ctx = ctx;
}
onFinished(files: RunnerTestFile[]) {
for (const fileTask of files) {
// eski görev uygulamasının "module" yerine "file" kullandığına dikkat edin
const testModule = this.ctx.state.getReportedEntity(
fileTask
) as TestModule;
for (const task of testModule.children) {
// ^?
console.log('finished', task.type, task.fullName);
}
}
}
}
Bu API'yi Vitest 2.1'de stabilize etmeyi planlıyoruz.
TestCase
TestCase
, tek bir testi temsil eder.
declare class TestCase {
readonly type = 'test' | 'custom';
/**
* Görev örneği.
* @experimental Genel görev API'si deneyseldir ve semver'i takip etmez.
*/
readonly task: RunnerTestCase | RunnerCustomCase;
/**
* Testle ilişkili proje.
*/
readonly project: TestProject;
/**
* Testin tanımlandığı test modülüne doğrudan başvuru.
*/
readonly module: TestModule;
/**
* Testin adı.
*/
readonly name: string;
/**
* Tüm üst süitler dahil olmak üzere testin tam adı, '>' ile ayrılmış.
*/
readonly fullName: string;
/**
* Benzersiz tanımlayıcı.
* Bu kimlik deterministiktir ve birden çok çalıştırmada aynı test için aynı olacaktır.
* Kimlik, proje adına, modül kimliğine ve test konumuna dayanır.
*/
readonly id: string;
/**
* Testin tanımlandığı modüldeki konum.
* Konumlar yalnızca `includeTaskLocation` yapılandırmada etkinleştirilmişse toplanır.
*/
readonly location: { line: number; column: number } | undefined;
/**
* Üst süit. Test doğrudan modül içinde çağrıldıysa, üst modülün kendisi olacaktır.
*/
readonly parent: TestSuite | TestModule;
/**
* Testin başlatıldığı seçenekler.
*/
readonly options: TaskOptions;
/**
* Testin, süiti başarısız etmediğini kontrol eder.
* Test henüz bitmediyse veya atlandıysa, `true` döndürür.
*/
ok(): boolean;
/**
* Yürütülmesi sırasında teste eklenen özel meta veriler.
*/
meta(): TaskMeta;
/**
* Test sonuçları. Test henüz bitmediyse veya yeni toplandıysa `undefined` olacaktır.
*/
result(): TestResult | undefined;
/**
* Test hakkında süre, bellek kullanımı vb. gibi faydalı bilgiler.
*/
diagnostic(): TestDiagnostic | undefined;
}
export type TestResult =
| TestResultPassed
| TestResultFailed
| TestResultSkipped;
export interface TestResultPassed {
/**
* Test başarıyla geçti.
*/
state: 'passed';
/**
* Test yürütülmesi sırasında atılan hatalar.
*
* **Not**: Test başarıyla yeniden denendiyse, hatalar yine de rapor edilecektir.
*/
errors: TestError[] | undefined;
}
export interface TestResultFailed {
/**
* Test başarısız oldu.
*/
state: 'failed';
/**
* Test yürütülmesi sırasında atılan hatalar.
*/
errors: TestError[];
}
export interface TestResultSkipped {
/**
* Test `only`, `skip` veya `todo` bayrağıyla atlandı.
* Hangisinin kullanıldığını `mode` seçeneğinde görebilirsiniz.
*/
state: 'skipped';
/**
* Atlanan testlerin hatası yoktur.
*/
errors: undefined;
}
export interface TestDiagnostic {
/**
* Testin süresi `slowTestThreshold` değerini aşıyorsa.
*/
slow: boolean;
/**
* Test tarafından kullanılan bellek miktarı (bayt cinsinden).
* Bu değer, yalnızca test `logHeapUsage` bayrağı etkinleştirilerek çalıştırıldıysa kullanılabilir.
*/
heap: number | undefined;
/**
* Testin yürütülmesi için geçen süre (ms cinsinden).
*/
duration: number;
/**
* Testin başladığı zaman (ms cinsinden).
*/
startTime: number;
/**
* Testin yeniden deneme sayısı.
*/
retryCount: number;
/**
* Testin `repeats` seçeneğiyle yapılandırıldığı gibi tekrar sayısı.
* Bu değer, test tekrar sırasında başarısız olursa ve `retry` yapılandırılmamışsa daha düşük olabilir.
*/
repeatCount: number;
/**
* Test ikinci denemede geçtiyse.
*/
flaky: boolean;
}
TestSuite
TestSuite
, testleri ve diğer süitleri içeren tek bir süiti temsil eder.
declare class TestSuite {
readonly type = 'suite';
/**
* Görev örneği.
* @experimental Genel görev API'si deneyseldir ve semver'i takip etmez.
*/
readonly task: RunnerTestSuite;
/**
* Testle ilişkili proje.
*/
readonly project: TestProject;
/**
* Süitin tanımlandığı test modülüne doğrudan başvuru.
*/
readonly module: TestModule;
/**
* Süitin adı.
*/
readonly name: string;
/**
* Tüm üst süitler dahil olmak üzere süitin tam adı, '>' ile ayrılmış.
*/
readonly fullName: string;
/**
* Benzersiz tanımlayıcı.
* Bu kimlik deterministiktir ve birden çok çalıştırmada aynı test için aynı olacaktır.
* Kimlik, proje adına, modül kimliğine ve test konumuna dayanır.
*/
readonly id: string;
/**
* Süitin tanımlandığı modüldeki konum.
* Konumlar yalnızca `includeTaskLocation` yapılandırmada etkinleştirilmişse toplanır.
*/
readonly location: { line: number; column: number } | undefined;
/**
* Bu süitin parçası olan süit ve test koleksiyonu.
*/
readonly children: TaskCollection;
/**
* Süitin başlatıldığı seçenekler.
*/
readonly options: TaskOptions;
}
TestModule
TestModule
, süitleri ve testleri içeren tek bir dosyayı temsil eder.
declare class TestModule extends SuiteImplementation {
readonly type = 'module';
/**
* Görev örneği.
* @experimental Genel görev API'si deneyseldir ve semver'i takip etmez.
*/
readonly task: RunnerTestFile;
/**
* Bu modülün parçası olan süit ve test koleksiyonu.
*/
readonly children: TestCollection;
/**
* Bu genellikle mutlak bir Unix dosya yoludur.
* Dosya diskte değilse sanal bir kimlik olabilir.
* Bu değer Vite'nin `ModuleGraph` kimliğine karşılık gelir.
*/
readonly moduleId: string;
/**
* Modül hakkında süre, bellek kullanımı vb. gibi faydalı bilgiler.
* Modül henüz yürütülmediyse, tüm teşhis değerleri `0` döndürür.
*/
diagnostic(): ModuleDiagnostic;
}
export interface ModuleDiagnostic {
/**
* Bir ortamı içe aktarmak ve başlatmak için geçen süre.
*/
environmentSetupDuration: number;
/**
* Vitest'in test donanımını (çalıştırıcı, sahte nesneler vb.) kurması için geçen süre.
*/
prepareDuration: number;
/**
* Test modülünü içe aktarmak için geçen süre.
* Bu, modüldeki her şeyi içe aktarmayı ve süit geri çağırmalarını yürütmeyi içerir.
*/
collectDuration: number;
/**
* Kurulum modülünü içe aktarmak için geçen süre.
*/
setupDuration: number;
/**
* Modüldeki tüm testlerin ve kancaların birikmiş süresi.
*/
duration: number;
}
TestCollection
TestCollection
, süit ve test koleksiyonunu temsil eder. Ayrıca kendi üzerinde yineleme yapmak için faydalı yöntemler sağlar.
declare class TestCollection {
/**
* Dizide belirli bir dizindeki testi veya süiti döndürür.
*/
at(index: number): TestCase | TestSuite | undefined;
/**
* Koleksiyondaki test ve süit sayısı.
*/
size: number;
/**
* Daha kolay manipülasyon için koleksiyonu dizi biçiminde döndürür.
*/
array(): (TestCase | TestSuite)[];
/**
* Bu koleksiyonun ve alt öğelerinin parçası olan tüm süitleri filtreler.
*/
allSuites(): IterableIterator<TestSuite>;
/**
* Bu koleksiyonun ve alt öğelerinin parçası olan tüm testleri filtreler.
*/
allTests(state?: TestResult['state'] | 'running'): IterableIterator<TestCase>;
/**
* Yalnızca bu koleksiyonun parçası olan testleri filtreler.
*/
tests(state?: TestResult['state'] | 'running'): IterableIterator<TestCase>;
/**
* Yalnızca bu koleksiyonun parçası olan süitleri filtreler.
*/
suites(): IterableIterator<TestSuite>;
[Symbol.iterator](): IterableIterator<TestSuite | TestCase>;
}
Örneğin, bir modül içindeki tüm testler üzerinde testModule.children.allTests()
çağrısı yaparak yineleme yapabilirsiniz:
function onFileCollected(testModule: TestModule): void {
console.log('collecting tests in', testModule.moduleId);
// modüldeki tüm testler ve süitler üzerinde yineleme yapın
for (const task of testModule.children.allTests()) {
console.log('collected', task.type, task.fullName);
}
}
TestProject
TestProject
, modülle ilişkili bir projedir. Bu modül içindeki her test ve süit aynı projeye başvuracaktır.
Proje, yapılandırmayı veya sağlanan bağlamı almak için kullanışlıdır.
declare class TestProject {
/**
* Genel vitest örneği.
* @experimental Genel Vitest API'si deneyseldir ve semver'i takip etmez.
*/
readonly vitest: Vitest;
/**
* Bu test projesinin ilişkili olduğu çalışma alanı projesi.
* @experimental Genel Vitest API'si deneyseldir ve semver'i takip etmez.
*/
readonly workspaceProject: WorkspaceProject;
/**
* Vite'nin geliştirme sunucusu örneği. Her çalışma alanı projesinin kendi sunucusu vardır.
*/
readonly vite: ViteDevServer;
/**
* Çözümlenmiş proje yapılandırması.
*/
readonly config: ResolvedProjectConfig;
/**
* Çözümlenmiş genel yapılandırma. Çalışma alanı projesi yoksa, bu `config` ile aynı olacaktır.
*/
readonly globalConfig: ResolvedConfig;
/**
* Serileştirilmiş proje yapılandırması. Bu, testlerin aldığı yapılandırmadır.
*/
get serializedConfig(): SerializedConfig;
/**
* Projenin adı veya ayarlanmamışsa boş bir dize.
*/
name(): string;
/**
* Projeye sağlanan özel bağlam.
*/
context(): ProvidedContext;
/**
* Projeye özel serileştirilebilir bir bağlam sağlayın. Bu bağlam, testler çalıştığında kullanılabilir olacaktır.
*/
provide<T extends keyof ProvidedContext & string>(
key: T,
value: ProvidedContext[T]
): void;
}
Dışa Aktarılan Raporlayıcılar
vitest
, hazır olarak kullanabileceğiniz birkaç yerleşik raporlayıcı ile birlikte gelir.
Yerleşik raporlayıcılar:
BasicReporter
DefaultReporter
DotReporter
JsonReporter
VerboseReporter
TapReporter
JUnitReporter
TapFlatReporter
HangingProcessReporter
Temel Abstract raporlayıcılar:
BaseReporter
Arayüz raporlayıcıları:
Reporter