عرفان
عرفان
خواندن ۳ دقیقه·۷ سال پیش

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

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

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

اول از همه یک فایل جدید به اسم 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: erfun.kh@gmail.com 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

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

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

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

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

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

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


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

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


ci cdgitlab ciتستtddgolang
یه دولوپر که سعی می‌کنه عمیق و کم هزینه باشه، از هرچیزی که بلدم می‌نویسم تا مطمئن‌شم درست یادش گرفتم.
شاید از این پست‌ها خوشتان بیاید