0Pricing
R Academy · Ders

testthat ile Birim Testi

test_that() blokları yazın, beklentileri kullanın ve testleri devtools::test() ile çalıştırın.

testthat ile Birim Testi, CoddyKit'te ücretsiz bir R Academy dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, R Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. R Academy kursu toplamda 4 dersten oluşur.

Neden Birim Testi?

Birim testleri, tek tek işlevlerin doğru davranıp davranmadığını otomatik olarak doğrular. Kodunuzu değiştirdiğinizde gerilemeleri yakalar, çalıştırılabilir belge görevi görür ve güvenli bir şekilde yeniden düzenleme yapmanız için güven verir. testthat paketi, R paketleri için standart test çerçevesidir.

testthat'i Kurma

usethis::use_testthat(), testthat'i DESCRIPTION içindeki Suggests alanına ekler, tests/testthat/ dizinini oluşturur ve çalıştırıcı betiği tests/testthat.R dosyasını oluşturur. Yeni bir paketi başlatırken bunu bir kez çalıştırın.

# usethis::use_testthat()
#
# Creates:
# tests/
#   testthat.R                  <- runner (do not edit)
#   testthat/
#     (empty — write test files here)
#
# Updates DESCRIPTION:
# Suggests: testthat (>= 3.0.0)
# Config/testthat/edition: 3

Test Dosyası Oluşturma

usethis::use_test('add'), tests/testthat/test-add.R dosyasını oluşturur. Kurala göre test dosyaları test-{function_name}.R biçiminde adlandırılır. Her dosya, bir işlev veya özellik için yapılan testleri gruplar.

# usethis::use_test('add')  # creates tests/testthat/test-add.R
#
# Content of test-add.R:
# test_that('add() returns correct sum', {
#   expect_equal(add(1, 2), 3)
#   expect_equal(add(-1, 1), 0)
#   expect_equal(add(0.1, 0.2), 0.3, tolerance = 1e-7)
# })

test_that() Yapısı

test_that('description', { ... }), ilişkili beklentileri gruplar. Açıklama dizesi 'test that ...' cümlesini tamamlamalı ve başarısızlık iletilerinde yararlı olacak kadar belirli olmalıdır.

# Good test_that descriptions:
# test_that('add() handles negative numbers', { ... })
# test_that('add() recycles length-1 vectors', { ... })
# test_that('add() returns NA when input contains NA', { ... })
#
# Bad (too vague):
# test_that('it works', { ... })
# test_that('test1', { ... })

expect_equal() ve expect_identical()

expect_equal(actual, expected), kayan noktalı sayılar için sayısal tolerans kullanarak test yapar. expect_identical(actual, expected), tür de dahil olmak üzere tam eşitlik gerektirir. Çoğu durumda expect_equal() tercih edilir.

# test_that('add() adds correctly', {
#   expect_equal(add(1, 2), 3)            # numeric equality
#   expect_equal(add(0.1, 0.2), 0.3)     # tolerance handles floating point
#   expect_identical(add(1L, 2L), 3L)    # exact type match: integer
#   expect_identical(add(1.0, 2.0), 3.0) # exact type match: double
# })

expect_error() ve expect_warning()

İşlevlerin doğru hataları ve uyarıları üretip üretmediğini test edin. Hata iletisiyle eşleşmesi için bir normal ifade deseni verin; bu, herhangi bir hatanın değil, doğru hatanın oluşturulmasını sağlar.

# test_that('add() validates input types', {
#   expect_error(
#     add('a', 2),
#     regexp = 'numeric'   # message must contain 'numeric'
#   )
#   expect_error(
#     add(NULL, 1),
#     regexp = 'numeric'
#   )
# })
#
# test_that('sqrt() warns on negative input', {
#   expect_warning(sqrt(-1))
# })

expect_true() ve expect_false()

expect_true(expr) ve expect_false(expr), mantıksal koşulları test eder. Tek bir mantıksal değer döndüren yüklemleri veya koşulları test ederken bunları kullanın.

# test_that('is_positive() returns correct logical', {
#   expect_true(is_positive(5))
#   expect_true(is_positive(0.001))
#   expect_false(is_positive(0))
#   expect_false(is_positive(-3))
# })
#
# # Also useful for vector tests:
# test_that('add() result has correct length', {
#   result <- add(c(1,2,3), c(4,5,6))
#   expect_true(length(result) == 3)
# })

Diğer Beklenti İşlevleri

testthat, farklı senaryolar için birçok beklenti işlevi sağlar:

  • expect_length(x, n) — vektör uzunluğunu denetler
  • expect_type(x, 'double') — temel türü denetler
  • expect_s3_class(x, 'data.frame') — S3 sınıfını denetler
  • expect_null(x) — NULL olup olmadığını denetler
  • expect_match(string, regexp) — dize desenini denetler
# test_that('add() output has correct type and length', {
#   result <- add(c(1.0, 2.0), c(3.0, 4.0))
#   expect_type(result, 'double')
#   expect_length(result, 2)
# })
#
# test_that('summary_stats() returns a data frame', {
#   result <- summary_stats(rnorm(100))
#   expect_s3_class(result, 'data.frame')
# })

devtools::test() ile Testleri Çalıştırma

devtools::test() (Ctrl+Shift+T), tüm test dosyalarını çalıştırır ve başarılı testlerin, başarısızlıkların ve uyarıların özetini görüntüler. Tek tek test başarısızlıklarında, başarısız olan beklenti ile gerçek ve beklenen değerler gösterilir.

# devtools::test()
#
# Example output:
# == Testing mypackage ====================================
# v | OK F W S | Context
# v |  3       | add [0.1s]
# v |  4       | subtract [0.1s]
# x |  2 1     | multiply [0.2s]
# -- Failure (test-multiply.R:5): multiply() handles zero
# multiply(5, 0) not equal to 0.
# Actual:   5
# Expected: 0
# ==========================================================
# [ FAIL 1 | WARN 0 | SKIP 0 | PASS 9 ]

covr ile Test Kapsamı

covr::package_coverage(), paketinizin satırlarının yüzde kaçının testler tarafından yürütüldüğünü ölçer. covr::report(), kapsanan (yeşil) ve kapsanmayan (kırmızı) satırları gösteren bir HTML raporu açar. En az %80 kapsam hedefleyin.

# library(covr)
# cov <- package_coverage()
# print(cov)
#
# Example output:
# mypackage Coverage: 87.50%
# R/add.R:      100.00%
# R/subtract.R: 100.00%
# R/utils.R:     62.50%  <- needs more tests!
#
# covr::report()  # interactive HTML report
# covr::zero_coverage(cov)  # list uncovered lines

Sınır Durumlarını Test Etme

İyi testler yalnızca olağan akışı değil, sınır durumlarını da kapsar:

  • Boş girdiler: numeric(0), character(0)
  • NA girdileri: işlev NA'yı olduğu gibi aktarıyor mu veya işliyor mu?
  • 1 uzunluklu ve n uzunluklu girdiler
  • Sınır değerleri: 0, negatif sayılar, çok büyük değerler
  • Yanlış türler: kullanıcı sayısal bir işleve dize gönderdiğinde ne olur?
# test_that('add() handles edge cases', {
#   expect_equal(add(numeric(0), numeric(0)), numeric(0))  # empty
#   expect_true(is.na(add(NA, 1)))                        # NA propagation
#   expect_equal(add(1, c(1,2,3)), c(2,3,4))              # recycling
#   expect_equal(add(.Machine$integer.max, 0L),           # boundary
#               .Machine$integer.max)
# })

Hızlı Kontrol: expect_error()

expect_error(my_fn('bad'), regexp = 'invalid input') çağrısını yapıyorsunuz. Bu test neyi doğrular?

Birim Testi Özeti

testthat ile bir R paketini test etme:

  • usethis::use_testthat() — test altyapısını bir kez kurar
  • usethis::use_test('fn') — tests/testthat/test-fn.R dosyasını oluşturur
  • test_that('description', {...}) — ilişkili beklentileri gruplandırır
  • expect_equal(), expect_error(), expect_warning(), expect_true(), expect_false() — temel beklenti işlevleri
  • devtools::test() — tüm testleri çalıştırır (Ctrl+Shift+T)
  • covr::package_coverage() — test kapsamını ölçer

Sıkça Sorulan Sorular

“testthat ile Birim Testi” dersi ücretsiz mi?

Evet — “testthat ile Birim Testi” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve R Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. R Academy kursu toplamda 4 dersten oluşur.

“testthat ile Birim Testi” dersinde ne öğreneceğim?

test_that() blokları yazın, beklentileri kullanın ve testleri devtools::test() ile çalıştırın. R Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

R Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te R Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.

“testthat ile Birim Testi” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu R Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her R Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. usethis ve devtools ile Paket Yapısı
  2. roxygen2 ile İşlevleri Belgeleme
  3. testthat ile Birim Testi
  4. CRAN'e Gönderim ve Paket Bakımı
← R Academy Sayfasına Dön