![]() |
VOOZH | about |
本文介紹如何使用 Docker 構建一個高效的 Web 開發環(Linux+Docker+Python+JavaScript),這也是我的日常開發環境。
準備Docker
安裝Docker
不要漏了閱讀Create a Docker group部分。安裝Docker Compose
也可以使用pip install docker-compose安裝。Docker Compose快捷命令
$ which docker-compose /usr/bin/docker-compose $ cp /usr/bin/docker-compose /usr/bin/dc
因為在我的系統(Arch Linux)上,dc是一個系統自帶的任意精度的計算器,所以直接覆蓋它。
如果你的系統沒有自帶dc,你也可以在~/.bashrc文件中添加alias dc=docker-compose實現。
用Google搜Docker教程,趕緊入門吧。另外,Docker官網的教程最新,最準確,最全面,非常值得去看。
剛開始使用Docker時最煩的就是下載鏡像,太!慢!了!
現在DaoCloud和阿里雲都有提供免費的鏡像加速服務,逐漸也有其他一些服務商提供鏡像加速。
首先,需要獲取一個鏡像加速地址(registry-mirror),需註冊後打開下面連結。
如果您的系統是 Ubuntu 12.04 14.04,Debain 8 等系統,Docker 1.9 以上,編輯文件,添加或修改registry-mirror:DOCKER_OPTS="$DOCKER_OPTS --registry-mirror=https://xxxxxx.mirror.aliyuncs.com"
重啟Docker:
如果你的系統使用 systemd 作為系統和服務管理器,Docker 1.9 以上,編輯/usr/lib/systemd/system/docker.serviceExecStart=/usr/bin/dockerd -H fd:// --registry-mirror=https://xxxxxx.mirror.aliyuncs.com
重啟Docker:
sudo systemctl daemon-reload sudo systemctl restart docker
可以使用服務商提供的腳本一鍵配置(不一定能配成功)。
推薦豆瓣的鏡像,速度很快。
命令行使用,全局配置,編輯~/.config/pip/pip.conf文件:ini [global] index-url = https://pypi.douban.com/simplenpm鏡像加速
推薦淘寶鏡像
命令行使用:
npm --registry=https://registry.npm.taobao.org
全局設置:
把依賴裝進DockerWeb開發,基本上都會用到資料庫,緩存等等。使用Docker可以輕鬆的安裝和控制這些依賴,這也是高效測試的基礎。
通常項目結構如下(這裡只介紹開發環境,生產環境以後再補充):
app/ 項目代碼 docker/ 容器的初始配置 data/ 數據,日誌等等 manage.py 啟動腳本 Dockerfile 生產環境鏡像 docker-compose.yml 生產環境 docker-compose-dev.yml 開發環境docker-compose-dev.yml文件,這裡假設依賴 MySQL 5.7 和
Redis:version: '2' services: mysql: image: mysql:5.7 environment: - MYSQL_ROOT_PASSWORD=root volumes: - ./docker/mysql/init.sql:/docker-entrypoint-initdb.d/init.sql -
./data/mysql:/var/lib/mysql ports: - "3306:3306" redis: image: redis:3 volumes: - ./data/redis:/data ports: -
"6379:6379"./docker/mysql/init.sql是用於創建資料庫的腳本(參考:),為了與線上資料庫編碼保持一致,內容大致如下:create database if not exists mydb character set utf8mb4 collate utf8mb4_unicode_ci;
運行以下命令,稍等片刻,所有依賴就啟動好了:
dc -f docker-compose-dev.yml up
如果需要操作資料庫:
dc -f docker-compose-dev.yml exec mysql mysql -uroot -proot mydbMakefile快捷命令
Make是Linux下最常用的構建工具,構建規則都寫在Makefile文件裡面,主要用於C語言的項目。這裡只用到它的一小部分功能:快捷命令,其他功能可參考Make 命令教程。
然後執行也可以在命令前面加上然後執行,命令本身就不會顯示出來了:$ make dev docker is awesome!
最終版本:
dev: @docker-compose -f docker-compose-dev.yml up mysql: @docker-compose -f docker-compose-dev.yml exec mysql mysql -uroot -proot mydbPython高效測試
我是單元測試的忠實擁護者,因為我意識到單元測試能極大的減少調試,修改BUG,重構的時間和痛苦。
當我重構一個 Python 2 的庫時,因為有完善的單元測試,所有我能放心大膽的修改代碼,修改之後我只需運行一下測試就知道哪裡還有問題需要修改,而不用去猜測和仔細檢查代碼以避免疏漏。
當全部測試通過之後,我就有信心這個庫不會出大的Bug,至少能和上一個版本差不多穩定。
另一方面,我也意識到不能過度追求測試的數量和覆蓋率。
過度的測試需要花費太多的時間和精力,而收到的效果甚微,95% 和 99%的測試覆蓋率其實差別不大,99% 和 100% 的差別就更小了,但是為了達到更高的測試覆蓋率,卻需要仔細的構造測試用例才能執行到未測試的代碼。
測試的付出和收益中有個平衡點,達到預期目標即可,簡言之,點到為止:
my philosophy is to test as little as possible to reach a given level of confidence
這兩篇問答很值得一讀:
上面介紹的是測試之道,下面說的是測試之術。
對接口做測試,不對具體實現做測試
接口是供其他模塊調用的最小單元,參數,返回值,可能拋出的異常這些都比較明確,接口也較少出現改動。這意味著對接口做測試的優勢:
有價值,不測別人不用的代碼
容易測,接口文檔明確
不用改,接口較少改動
開發人員自測,先寫具體實現後寫測試
自己的代碼自己測,一方面自己對自己寫的接口會更熟悉,容易編寫測試用例。
另一方面是自己的屁股自己擦,自己寫的代碼理應保證邏輯正確,如果測試中發現Bug自己可以及時改,
不用等測試人員告訴你:大哥,你屁股沒擦乾淨!
先寫具體實現後寫測試是因為如果先寫測試,就要求接口設計非常完善,不然寫具體實現時發現
接口設計不合理,再去修改測試代碼就浪費了時間和精力。另外,測試是為了檢驗邏輯是否正確,如果只有測試沒有具體實現,難以判斷測試寫的對不對,看不到測試覆蓋率,就難以判斷測試完不完善。
用Docker運行測試資料庫
業務代碼很多都是增刪查改,所以不可能mock一個資料庫。
另外測試過程中會產生很多垃圾數據,絕對不能用生產環境的資料庫去測。
用Docker運行測試資料庫是一個非常好的解決辦法,啟動停止都非常簡單。
如果項目比較大,測試時間較長,還可以用內存來存儲資料庫數據(使用宿主機的/tmp目錄):
volumes: - /tmp/mysql:/var/lib/mysql
這樣測試速度能提高10倍左右。
測試之間相互獨立,可以按模塊單獨運行
測試開始前創建表,寫入初始數據,測試結束清空資料庫,這樣就能保證資料庫裡面的數據是確定的。
使用pytest執行測試,它可以控制執行。
哪些測試,不必每次都執行全部測試,插件也很豐富,非常方便。
藉助ipdb或pdb進行調試
掃碼關注編程派