حساب‌فان (بدون تست هرگز)

قبلا از اهمیت تست نوشتم، شاید اولش براتون سخت باشه، ولی کافیه یکبار با تست بنویسید بعد اون نمی‌تونید هیچ پروژه‌ای بدون تست بنویسید، درضمن اگر بخواید جاهای خوب استخدام بشید نیاز دارید تست نوشتن بلد باشید :)

برای نوشتن تست مجبوریم یکم پروژه تغییر بدیم وگرنه تست‌ها به راحتی اجرا نمیشن. (برای همین میگم از همون اول تست بنویسید)

اول از همه یک فایل جدید به اسم router.go درست می‌کنیم.

package main

import "github.com/gin-gonic/gin"

func setupRouter() *gin.Engine {

   router := gin.Default()

   router.GET("/", func(c *gin.Context) {
      c.JSON(200, gin.H{
         "message": "Hello world!",
      })
   })

   return router
}

همچنین میریم سراغ فایل اصلی پروژه یعنی main.go و کمی تغییرش میدیم.

package main

func main() {
   router := setupRouter()

   router.Run() // listen and serve on 0.0.0.0:8080
}

تغییرات واضحه، روتر جدا کردیم، نه بیشتر.

قبل هرکاری پکیج تست به glide.yaml اضافه میکنیم و دستور glide update میزنیم

package: gitlab.com/erfun/hesabFun
homepage: https://hesabfun.com

owners:
- name: ErFUN KH
  email: [email protected]
  homepage: https://erfun.net

import:
- package: github.com/gin-gonic/gin
  version: ~1.2.0

# testing package
- package: github.com/stretchr/testify

حالا باید تست بنویسیم، برای شروع فایل router_test.go ایجاد کنید همراه محتوای زیر:

package main

import (
   "net/http"
   "net/http/httptest"
   "testing"
   "encoding/json"

   "github.com/stretchr/testify/assert"
   "github.com/gin-gonic/gin"
)

func TestHelloWorldRoute(t *testing.T) {
   router := setupRouter()

   w := httptest.NewRecorder()
   req, _ := http.NewRequest("GET", "/", nil)
   router.ServeHTTP(w, req)

   //JSON encode our body data
   jsonEncoded, _ := json.Marshal(gin.H{"message":"Hello world!"})

   assert.Equal(t, 200, w.Code)
   assert.Equal(t, string(jsonEncoded), w.Body.String())
}

یه فانکشن برای تست helloWorld نوشتیم، یه شئی از روترمون ایجاد کردیم، ریکوئست ارسال کردیم، یه شئی دیگه از جوابی که درصورت درست بودن همه چی باید بگیریم درست کردیم، دو خط آخر هم استاتوس کد و جوابی که گرفتیم چک کردیم تا درست باشه، درصورت هرگونه مقایرت تست خطا میده و ما متوجه میشیم کد به درستی کار نمیکنه، البته این خیلی ساده بود، در صورتی که کد شما ممکنه خطا صادر کنه شما باید اون خطاها چک کنید تا مطمئن بشید درصورت حالت خاص کد به درستی خطا پاس میده. حالا بعدا عملی می‌نویسیم خیلی بهش فکر نکنید.

حالا که تست داریم باید بعد هرکامیت تست به صورت خودکار داخل گیت‌لب اجرا بشه و به ما خبر بده، برای این کار فایل .gitlab-ci.yml تو روت پروژه ایجاد میکنیم و داخلش اینطور پر میکنیم.

image: golang:1.10

stages:
  - build
  - test

before_script:
  - curl https://glide.sh/get | sh
  - mkdir -p /go/src/gitlab.com/
  - cp -r /builds/erfun /go/src/gitlab.com/erfun
  - cd /go/src/gitlab.com/erfun/hesabFun
  - glide install

build-project:
  stage: build
  script:
    - go build

test-project:
  stage: test
  script:
    - go test -v -cover

خط اول گفتیم از ایمیج رسمی گولنگ ورژن ۱.۱۰ استفاده میکنیم، یعنی سروری که برامون ران میکنه روش گولنگ نصبه (اگه درک نمی‌کنید چی میگم باید درمورد داکر بخونید، آموزش فارسی زیادی براش هست کافیه گوگل کنید)

خط بعدی گفتیم دوتا استیج بیلد و تست داریم

تو قسمت بی‌فور اسکریپت میگیم اول گلاید نصب کنه، بعد فایل پروژه کپی کنه جای استانداردش و پکیج‌هارو با گلاید دانلود کنه.

حالا تو استیج بیلد سعی میکنه پروژه بیلد کنه، اگه با موفقیت انجام بشه میره برای استیج تست، اگه تست با موفقیت انجام بشه یعنی کدهامون درست کار میکنه.

البته انجام تمام این مراحل با کل لاگ‌ها می‌تونید از قسمت پایپ‌لاین پروژه داخل سایت گیت لب ببینید.

یه همچین چیزی، ولی خب فعلا شلوغه و رو پندینگ مونده، تستا که انجام بشه دوتا تیک سبز می‌خوره.
یه همچین چیزی، ولی خب فعلا شلوغه و رو پندینگ مونده، تستا که انجام بشه دوتا تیک سبز می‌خوره.


بعد اجرای صحیح تست‌ها با همچین چیزی مواجه می‌شید.
بعد اجرای صحیح تست‌ها با همچین چیزی مواجه می‌شید.

حالا اگه تست‌ها پاس بشه اتفاق خاصی نمیفته ولی اگه خطایی بده براتون ایمیل ارسال میشه که فلان خطا داد، ولی ایمیل کمی کنده، ترجیح من اینه نوتیفیکیشن بده، برای این کار ربات تلگرام هست ولی اگه اسلک پیشنهاد میدید از تنظیمات پروژه در سایت گیت لب در دسترس تونه.