Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Go

Pengujian kode Data-intensif dengan Go, Bagian 2

by
Difficulty:IntermediateLength:MediumLanguages:
This post is part of a series called Testing Data-Intensive Code with Go.
Testing Data-Intensive Code With Go, Part 1
Testing Data-Intensive Code With Go, Part 3

Indonesian (Bahasa Indonesia) translation by Kang Abbad (you can also view the original English article)

Peninjauan

Ini adalah bagian dua dari lima seri tutorial pada pengujian kode data-intensif. Pada bagian satu, aku menutupi desain lapisan data abstrak yang memungkinkan pengujian yang tepat, bagaimana menangani kesalahan dalam lapisan data, bagaimana untuk mengolok-olok kode akses data, dan bagaimana untuk menguji melawan lapisan data abstrak. Dalam tutorial ini, aku akan pergi selama pengujian terhadap lapisan nyata di memori data berdasarkan SQLite populer.

Pengujian terhadap Penyimpanan Data di memori

Pengujian terhadap lapisan data abstrak besar untuk beberapa kasus digunakan di mana Anda perlu banyak presisi, Anda memahami persis apa panggilan kode di bawah ujian akan membuat terhadap lapisan data, dan Anda OK dengan mempersiapkan tanggapan tiruan.

Kadang-kadang, hal ini tidak semudah itu. Serangkaian panggilan ke lapisan data mungkin sulit untuk gambar, atau dibutuhkan banyak usaha untuk mempersiapkan tanggapan kalengan yang tepat yang berlaku. Dalam kasus ini, Anda mungkin perlu untuk bekerja melawan sebuah toko di memori data.

Manfaat dari sebuah toko di memori data adalah:

  • Ini sangat cepat.
  • Anda bekerja melawan sebuah toko data aktual.
  • Anda sering dapat mengisinya dari awal menggunakan file atau kode.

Khususnya jika penyimpanan data Anda adalah DB relasional, maka SQLite adalah opsi yang fantastis. Hanya ingat bahwa ada perbedaan antara SQLite dan DB relasional populer lainnya seperti MySQL dan PostgreSQL.

Pastikan Anda memperhitungkan hal itu dalam tes Anda. Perhatikan bahwa Anda masih mengakses data Anda melalui lapisan data abstrak, tetapi sekarang backing store selama pengujian adalah penyimpanan data di memori. Tes Anda akan mengisi data uji secara berbeda, tetapi kode yang sedang diuji tidak menyadari apa yang sedang terjadi.

Menggunakan SQLite

SQLite adalah DB yang disematkan (terkait dengan aplikasi Anda). Tidak ada server DB terpisah yang berjalan. Ini biasanya menyimpan data dalam file, tetapi juga memiliki opsi dari backing store di memori.

Berikut adalah struct InMemoryDataStore. Ini juga merupakan bagian dari paket concrete_data_layer, dan itu mengimpor paket pihak ketiga go-sqlite3 yang mengimplementasikan antarmuka "database / sql" Golang standar.

Membangun Lapisan Data Dalam Memori

NewInMemoryDataLayer() fungsi konstruktor menciptakan DB sqlite di memori dan mengembalikan pointer ke InMemoryDataLayer.

Catatan bahwa setiap kali Anda membuka baru ": memori:" DB, Anda mulai dari awal. Jika Anda ingin ketekunan melintasi beberapa panggilan untuk NewInMemoryDataLayer(), Anda harus menggunakan file::memory:?cache=shared. Melihat thread diskusi GitHub untuk rincian lebih lanjut.

InMemoryDataLayer mengimplementasikan antarmuka DataLayer dan benar-benar menyimpan data dengan hubungan yang benar dalam sqlite database. Untuk melakukannya, pertama kita perlu membuat skema yang tepat, yang sebenarnya pekerjaan createSqliteSchema() fungsi dalam konstruktor. Ini menciptakan tiga tabel data — lagu, pengguna, dan label — dan lintas-referensi dua tabel, label_song dan user_song.

Ia menambahkan beberapa kendala, indeks, dan kunci asing berhubungan tabel dengan satu sama lain. Aku tidak akan diam pada rincian tertentu. Inti dari itu adalah bahwa skema seluruh DDL dinyatakan sebagai string tunggal (terdiri dari beberapa pernyataan DDL) yang kemudian dijalankan menggunakan db. Metode db.Exec(), dan jika ada yang tidak beres, mengembalikan kesalahan.

Penting untuk menyadari bahwa sementara SQL standar, setiap sistem manajemen database (DBMS) memiliki citarasa tersendiri, dan tepat skema definisi tentu tidak akan bekerja untuk lain DB.

Melaksanakan Layer Data di memori

Untuk memberikan rasa upaya pelaksanaan lapisan di memori data, berikut adalah beberapa metode: AddSong() dan GetSongsByUser().

Metode AddSong() melakukan banyak pekerjaan. Itu memasukkan data ke dalam tabel lagu serta ke masing-masing Tabel referensi: label_song dan user_song. Pada setiap titik, jika operasi gagal, hanya mengembalikan kesalahan. Saya tidak menggunakan transaksi karena itu dirancang untuk tujuan pengujian, dan saya tidak khawatir tentang sebagian data dalam DB.

GetSongsByUser() menggunakan join + Pilih sub dari referensi silang user_song kembali lagu untuk pengguna tertentu. Menggunakan metode Query() dan kemudian kemudian scan setiap baris untuk mengisi struct lagu dari domain object model dan kembali sepotong lagu. Implementasi rendah sebagai DB relasional yang tersembunyi dengan aman.

Ini adalah contoh yang bagus dari memanfaatkan DB nyata relasional seperti sqlite untuk mengimplementasikan Toko di memori data vs bergulir kita sendiri, yang akan memerlukan menjaga maps dan memastikan semua pembukuan benar.

Menjalankan tes terhadap SQLite

Sekarang bahwa kita memiliki lapisan data di memori yang tepat, mari kita lihat di tes. Aku meletakkan tes ini dalam paket terpisah disebut sqlite_test, dan mengimpor lokal lapisan data abstrak (domain model), lapisan data beton (untuk membuat lapisan data di memori), dan lagu manager (kode di bawah ujian). Saya juga menyiapkan dua lagu untuk tes dari artis Panama sensasional El Chombo!

Metode uji membuat lapisan di memori data baru untuk memulai dari nol dan sekarang dapat memanggil metode lapisan data untuk mempersiapkan lingkungan pengujian. Ketika semuanya sudah diatur, mereka dapat memanggil metode manajer lagu dan kemudian memverifikasi bahwa lapisan data berisi negara diharapkan.

Sebagai contoh, metode pengujian AddSong_Success() menciptakan pengguna, menambahkan lagu menggunakan Pengelola lagu AddSong() metode, dan memverifikasi bahwa kemudian memanggil GetSongsByUser() kembali lagu ditambahkan. Kemudian menambahkan lagu lain dan memverifikasi lagi.

Metode pengujian TestAddSong_Duplicate() serupa, tetapi bukan menambahkan lagu baru untuk kedua kalinya, ia menambahkan lagu yang sama, yang mengakibatkan kesalahan duplikat lagu:

Kesimpulan

Dalam tutorial ini, kami menerapkan lapisan di memori data berdasarkan SQLite, penduduknya database SQLite di memori dengan data uji, dan dimanfaatkan lapisan di memori data untuk menguji aplikasi.

Dalam bagian tiga, kita akan fokus pada pengujian terhadap lapisan lokal data yang kompleks yang terdiri dari beberapa data toko (DB relasional dan Redis cache). Menantikan.

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.