Umpan balik yang cepat dan personal telah menjadi inti pengalaman belajar di DataCamp sejak kami meluncurkan kursus pertama. Jika siswa mengirimkan kode yang berisi kesalahan, mereka diberi tahu di mana letak kesalahannya dan bagaimana cara memperbaikinya. Anda dapat mencobanya di kursus Introduction to R gratis kami. Tangkapan layar di bawah ini dari kursus Intermediate R kami.

Untuk memeriksa kiriman dan menghasilkan umpan balik, setiap latihan di DataCamp memiliki yang disebut Submission Correctness Test, atau SCT.
SCT adalah skrip berisi pengujian kustom yang menilai kode yang dikirimkan siswa serta output dan variabel yang mereka buat dengan kode tersebut. Untuk setiap bahasa yang kami ajarkan di DataCamp, kami membangun paket open-source yang sesuai untuk memudahkan verifikasi semua elemen dari kiriman siswa. Untuk latihan R, paket ini disebut testwhat. Selama bertahun-tahun, kami telah menambahkan banyak fungsi untuk:
- memeriksa penugasan variabel
- memeriksa pemanggilan fungsi dan hasil pemanggilan fungsi
- memeriksa if statement, for loop, dan while loop
- memeriksa definisi fungsi
- memeriksa apakah paket yang tepat telah dimuat
- memeriksa output yang dihasilkan siswa
- memeriksa pemanggilan plotting ggplot dan ggvis
- ...
Ketika fungsi-fungsi pemeriksaan ini menemukan kesalahan, mereka akan secara otomatis menghasilkan pesan umpan balik yang bermakna yang menunjuk siswa ke kesalahan mereka. Anda juga dapat menentukan pesan umpan balik kustom yang menimpa pesan yang dihasilkan secara otomatis ini.
Secara historis, testwhat sangat terhubung dengan backend kepemilikan kami yang mengeksekusi kode R di server DataCamp. Meskipun testwhat selalu bersifat open source, paket ini tidak akan bekerja dengan baik tanpa backend kustom ini dan testwhat hanya dapat digunakan dalam konteks DataCamp. Namun saat ini, testwhat dapat digunakan secara independen dan mendukung berbagai kasus penggunaan lainnya. Anda dapat memanfaatkan semua yang ditawarkan testwhat untuk menguji kiriman siswa, bahkan ketika format pengajaran Anda sangat berbeda dari milik DataCamp. Anda dapat memasang paketnya dari GitHub:
library(remotes) # devtools works fine too
install_github('datacamp/testwhat')
Sebagai demo singkat, bayangkan Anda meminta siswa membuat variabel x bernilai 5. Versi string dari solusi ideal akan seperti ini:
solution_code <- 'x <- 5'
Sekarang misalkan siswa mengirimkan skrip di mana x secara keliru diatur menjadi sebuah vektor dengan dua nilai, yang dapat ditulis sebagai berikut:
student_code <- 'x <- c(4, 5)'
testwhat memiliki fungsi bernama setup_state() yang mengeksekusi kiriman siswa dan skrip solusi dalam environment terpisah serta menangkap output dan error yang dihasilkan kode siswa. Semua informasi ini disimpan dalam yang disebut exercise state yang dapat Anda akses dengan ex():
library(testwhat)
setup_state(stu_code = student_code,
sol_code = solution_code)
ex()
## <RootState>
Exercise state ini dapat diteruskan ke beragam fungsi pemeriksaan yang disediakan testwhat dengan sintaks piping dari magrittr. Untuk memeriksa apakah siswa mendefinisikan variabel x, Anda dapat menggunakan check_object():
ex() %>% check_object('x')
## <ObjectState>
Kode ini berjalan baik, karena siswa memang mendefinisikan variabel x. Untuk melanjutkan dan memeriksa apakah siswa mendefinisikan variabel x dengan benar, Anda dapat menggunakan check_equal():
ex() %>% check_object('x') %>% check_equal()
## Error in check_that(is_equal(student_obj, solution_obj, eq_condition), : The contents of the variable `x` aren't correct. It has length 2, while it should have length 1.
Ini menghasilkan error. check_equal() mendeteksi bahwa nilai x di environment siswa (sebuah vektor) tidak cocok dengan nilai x di environment solusi (sebuah angka tunggal). Perhatikan bagaimana pesan error berisi pesan yang mudah dipahami yang menjelaskan kesalahan ini.
Contoh di atas bersifat interaktif: Anda menyiapkan state, lalu mengetik rangkaian fungsi pemeriksaan. Pada tingkat yang lebih tinggi, Anda dapat menggunakan run_until_fail() untuk membungkus kode pemeriksaan. Ini akan menjalankan rangkaian pengujian Anda hingga gagal:
library(testwhat)
setup_state(stu_code = 'x <- 4',
sol_code = 'x <- 5')
res <- run_until_fail({
ex() %>% check_object('x') %>% check_equal()
})
res$correct
## [1] FALSE
res$message
## [1] "The contents of the variable `x` aren't correct."
Pendekatan dasar membangun exercise state dengan kiriman siswa dan solusi lalu menggunakan run_until_fail() untuk mengeksekusi rangkaian pengujian dapat dengan mudah disematkan dalam alur kerja penilaian otomatis yang sesuai kebutuhan Anda. Misalkan siswa Anda telah mengirimkan tugas dalam bentuk skrip R yang Anda unduh ke komputer pada folder submissions (kami telah mengisi folder tersebut dengan beberapa data acak). Kita memiliki sejumlah skrip R di folder submissions. Setiap skrip R berisi kiriman siswa:
dir('submissions')
## [1] "student_a.R" "student_b.R" "student_c.R" "student_d.R" "student_e.R"
## [6] "student_f.R" "student_g.R" "student_h.R" "student_i.R" "student_j.R"
readLines('submissions/student_a.R')
## [1] "x <- 4"
readLines('submissions/student_b.R')
## [1] "x <- 5"
Kini kita dapat menelusuri semua kiriman ini, dan menghasilkan sebuah data.frame yang menyatakan apakah kiriman tersebut benar atau tidak untuk setiap siswa:
library(testwhat)
folder_name <- 'submissions'
all_files <- file.path(folder_name, dir(folder_name))
student_results <- sapply(all_files, function(file) {
student_code <- readLines(file)
setup_state(sol_code = 'x <- 5',
stu_code = student_code)
res <- run_until_fail({
ex() %>% check_object('x') %>% check_equal()
})
res$correct
})
results_df <- data.frame(name = all_files, correct = student_results,
row.names = NULL, stringsAsFactors = FALSE)
results_df
## name correct
## 1 submissions/student_a.R FALSE
## 2 submissions/student_b.R TRUE
## 3 submissions/student_c.R TRUE
## 4 submissions/student_d.R TRUE
## 5 submissions/student_e.R FALSE
## 6 submissions/student_f.R TRUE
## 7 submissions/student_g.R FALSE
## 8 submissions/student_h.R FALSE
## 9 submissions/student_i.R TRUE
## 10 submissions/student_j.R TRUE
Demo kecil ini masih agak kasar, tetapi semoga poinnya jelas: dengan sedikit utak-atik R untuk membangun input yang sesuai bagi setup_state(), Anda dapat memanfaatkan seluruh fungsi pemeriksaan testwhat. Pengujian yang Anda tentukan di run_until_fail() akan sekaligus memverifikasi pekerjaan siswa dan menghasilkan umpan balik bermakna untuk menunjukkan kesalahan yang mereka buat.
Untuk mempelajari lebih lanjut tentang testwhat, Anda dapat mengunjungi repositori GitHub atau dokumentasi paket, yang dihasilkan dengan pkgdown. Di sana terdapat vignette yang menguraikan cara menggunakan fungsi-fungsi pemeriksaan tertentu serta referensi fungsi yang menjelaskan semua argumen yang dapat Anda tentukan. Jangan ragu untuk membuat isu di GitHub atau menghubungi melalui content-engineering@datacamp.com, kami senang menerima umpan balik! Selamat mengajar!
Blog ini dibuat dengan RMarkdown. Anda dapat menemukan sumbernya di sini.
