Basic Stat Api adalah HTTP API yang menyediakan kalkulasi statistika dasar. Proyek ini terinspirasi dari demo API untuk gem ‘trend-ruby’ yang ditulis oleh Andrew Kane. Proyek ini adalah media belajar dalam membuat HTTP API, TDD, dan pemrograman dengan bahasa ruby.
Pada proyek ini, sinatra digunakan karena saya ingin mencoba untuk mengetahui beberapa low level component yang ada pada HTTP API (yang mana semuanya disediakan secara default oleh ‘rails magic’) dan mencoba untuk meminimalisir dependencies yang dibutuhkan. Selain itu beberapa library dan tools yang digunakan antara lain:
- rspec untuk melakukan test fitur. Rspec menyediakan beberapa DSL dan matcher yang sangat membantu dalam menulis pengujian yang ekspresif.
- rubocop untuk proses linting.
- ripper-tags untuk memetakan seluruh nama kelas menjadi ctags untuk memudahkan eksplor dan perpindahan file pada text editor.
- pry alat untuk memudahkan debugging.
Initiate
Proyek ini dimulai dari development dan testing pada bagian pada public endpoint dan custom middleware. saya tidak melakukan stub dan mock karena sejauh ini baik itu fitur maupun test case belum terhitung banyak sehingga waktu eksekusi test masih terbilang cepat (kecuali untuk pengujian rate limiting yang mana membutuhkan fungsi sleep
untuk mensimulasi rate limit yang kadaluarsa dan tidak bisa diakali dengan Timecop karena perhitungan berlangsung di redis). Hal ini tentu perlu menjadi catatan kedepannya jika fitur dan test case terus bertambah, mungkin dengan melakukan uji edge case menggunakan unit test ketimbang acceptance test/test yang berpotensi membutuhkan waktu yang lama.
example_id | status | run_time |
----------------------------------------------- | ------ | --------------- |
./spec/features/mean_spec.rb[1:1] | passed | 0.00308 seconds |
./spec/features/mean_spec.rb[1:2] | passed | 0.00431 seconds |
./spec/features/median_spec.rb[1:1] | passed | 0.00328 seconds |
./spec/features/median_spec.rb[1:2] | passed | 0.04989 seconds |
./spec/features/mode_spec.rb[1:1] | passed | 0.00376 seconds |
./spec/features/mode_spec.rb[1:2] | passed | 0.00467 seconds |
./spec/features/rate_limiting_spec.rb[1:1] | passed | 0.01857 seconds |
./spec/features/rate_limiting_spec.rb[1:2] | passed | 0.03867 seconds |
./spec/features/rate_limiting_spec.rb[1:3] | passed | 11.04 seconds |
./spec/features/standard_deviation_spec.rb[1:1] | passed | 0.00556 seconds |
./spec/features/standard_deviation_spec.rb[1:2] | passed | 0.00826 seconds |
Adding landing page
Untuk menampung demo (dan mungkin dokumentasi tiap endpoint) maka dibangunlah fitur landing page. Tidak seperti pengujian pada public endpoint, Capybara digunakan untuk melakukan pengujian tampilan (atau biasa disebut sebagai acceptance test).
example_id | status | run_time |
----------------------------------------------- | ------ | --------------- |
./spec/features/landing_page_spec.rb[1:1] | passed | 0.00949 seconds |
./spec/features/landing_page_spec.rb[1:2] | passed | 1.25 seconds |
Kenaikan waktu eksekusi pada landing_page_spec:2
terjadi karena Capybara membutuhkan driver javascript (pada project ini digunakan Cuprite) yang tidak secepat ketika Capybara menggunakan driver rack-test yang secara langsung berkomunikasi dengan rack interfaces sehingga tidak perlu memulai server.