轉自公衆號:AirtestProject
爲什麼你自己修改的Airtest源碼不生效?(上)
前言
相信小夥伴們多少都會遇到想要修改Airtest
源碼,方便自己腳本編寫的情況。這時,不少同學會立即去修改AirtestIDE
文件夾下Airtest
庫的.py
文件(如下圖),其實這樣修改是無效的,並不會達到預期的效果。
正確的修改Airtest
源碼的步驟是:
-
在本地安裝
python
環境 -
安裝
Airtest
-
安裝
Poco
-
在本地的
Airtest
庫中修改源碼
在本地安裝python環境
Airtest
支持Python
2和3,但是我們更推薦使用 Python3
。如果你願意的話我們也同樣建議使用 virtualenv
等虛擬環境新建一個乾淨的python
環境。各個版本的python
可以自行到python
官網上下載安裝。
python多環境管理擴展閱讀:Miniconda安裝教程,並使用PyCharm創建相關項目
安裝Airtest
使用 pip
安裝Airtest
框架 pip install airtest
注意: 在Mac/Linux
系統下,需要手動賦予adb
可執行權限,否則可能在執行腳本時遇到 Permission denied
的報錯:
# mac系統
> cd {your_python_path}/site-packages/airtest/core/android/static/adb/mac
# linux系統
> cd {your_python_path}/site-packages/airtest/core/android/static/adb/linux
> chmod +x adb
安裝poco
使用 pip
安裝poco
框架 pip install pocoui
,請注意庫的名稱爲 pocoui
,不是poco
,請不要填錯。
如果你在命令行中使用pip list
,看到同時存在poco
和pocoui
兩個庫,請把poco
卸載,因爲pocoui
纔是正確的庫。
在本地的Airtest庫裏面修改源碼
完成上述三步以後,其實就是在本地部署了一個python
環境來使用Airtest
和poco
。然後我們可以修改本地安裝的Airtest
庫裏面的源碼,使得修改生效。
舉個例子,打開你本地安裝的Airtest
庫,找到Airtest>--airtest>--core
目錄下的api.py
文件,在touch
方法里加一條代碼,如下:
那麼你在命令行運行腳本的時候,如果腳本里面寫有touch
語句,你在touch
方法裏面增加的print
語句也會生效:
如果想要你修改的內容在IDE也生效的話,只需要將IDE的運行環境改成本地運行環境即可:
這時候IDE運行時,使用的Airtest
庫就不是IDE自帶的Airtest
庫,而是你在本地安裝的Airtest
庫,運行一條touch
語句,之前對touch
方法的修改也會在IDE裏面生效了:
爲什麼你自己修改的Airtest源碼不生效?(中)
前言
Airtest
是一個開源項目,所以我們可以在 https://github.com/AirtestProject/Airtest 這裏看到它的源碼,除了直接看源碼學習之外,我們也可以clone或者fork一份項目下來自行修改,同時還能夠試用到Airtest
的開發分支。
關於GitHub上Airtest
源碼的遠程倉庫,我們主要想與大家分享兩方面的內容:
-
如何在本地安裝並使用
Airtest
在GitHub上的源碼; -
如何上傳本地的修改到
Airtest
遠程倉庫上給其他用戶使用。
因爲內容比較多,所以我們分倆期推文來介紹上述內容。今天這篇文章就是向大家介紹如何在本地安裝並使用Airtest
在Github上面的源碼。
從遠程倉庫上拉取分支
先從1個具體的例子來看看第一部分的內容。Airtest
遠程倉庫最近增加了一些新的修改,包括Android10
的初步支持,以及報告部分樣式的調整和BUG修復,如果我們想試用一下的話,就需要拉取Airtest
倉庫裏面這個分支的內容到本地上,再進行測試。
具體的步驟如下:
安裝Git客戶端
首先,我們需要在自己的計算機上安裝一個Git客戶端(安裝包可以從Git官網上獲取)。
克隆Airtest的遠程倉庫到本地
找到你想存放Airtest遠程倉庫的目錄,右鍵點擊Git bush here
,然後在命令行中輸入以下命令:
git clone [email protected]:AirtestProject/Airtest.git
運行之後客戶端就會把Airtest
的遠程倉庫下載到你的本地目錄:
如果運行命令以後,並沒有開始下載,而是出現如下提示:
這表明使用命令行去訪問GitHub的時候,需要先填寫身份認證,即需要新增SSH密鑰到你的GitHub賬戶上(僅需要做一次):
-
在客戶端運行
clip < ~/.ssh/id_rsa.pub
,即可將SSH密鑰複製到剪切板上 -
登錄GitHub,點擊右上角的頭像,選擇
Settings
-
單擊左側的菜單欄中的
SSH and GPG keys
-
再單擊
New SSH key
-
在
title
裏填寫自定義的描述標籤,在key
裏面,把剪切板的密鑰複製進去 -
單擊
Add SSH key
,再輸入你的GitHub密碼確認即可
拉取遠程倉庫的分支到本地
“Android10支持”相關分支的Pull Request
是 https://github.com/AirtestProject/Airtest/pull/618 ,也就是說id
是618, 要把這個PR拉取到本地,需要先進去剛纔克隆的Airtest
文件夾裏面,右鍵點擊Git bush here
,再執行以下代碼:
git fetch origin refs/pull/618/head:pr618
這條指令的意思是,將遠程倉庫的618號pull request
拉取到本地的pr618
分支上。
切換到pr618的分支
使用如下代碼即可切換到pr618這個分支:
git checkout pr618
將Airtest安裝到本地python環境
在測試前還需要先將這個Airtest
倉庫安裝到本地python
環境中,在命令行執行pip install -e .
(不要忘記最後是個.
號),因爲我們提升了yosemite.apk
的版本號,所以也可能會提示重新安裝yosemite.apk
。
安裝成功後,你還可以用pip list
檢查一下,當前的Airtest
是不是指向你克隆Airtest
的目錄。
測試支持Android10的分支
自此,我們就把支持Android10的pr拉取到我們本地上了,可以自由進行測試。
爲什麼你自己修改的Airtest源碼不生效?(下)
前言
前面我們向大家介紹瞭如何在本地安裝並使用Airtest
在Github上面的源碼。下面我們來講一下:“如何上傳本地的修改到Airtest
倉庫上給其他用戶使用”,即如何給開源項目貢獻代碼。
需要注意的是,clone
操作是不需要項目權限的,只要你註冊了GitHub賬號,就可以把開源的項目clone
下來。但是如果你想要貢獻代碼,即把你本地的代碼上傳到項目的遠程倉庫的話,一般都是不能直接傳的,因爲大部分人都不是項目的開發者,沒有直接push
代碼的權限,所以貢獻代碼的流程大致如下:
-
fork
原始項目到自己的賬號下 -
克隆
fork
到的項目到本地進行修改 -
提交修改並同步原始項目倉庫的更新
-
push
代碼到自己賬號的項目倉庫裏 -
向原始項目發起提交申請
-
原始項目的管理員同意後,纔會
merge
到原始項目的倉庫裏
下文是具體的操作方法。
給開源項目貢獻源碼
fork開源項目到自己的賬戶上
首先我們需要打開這個開源項目的url
:https://github.com/AirtestProject/Airtest ;然後點擊右上角的Fork
按鈕。
等待一段時間後,開源項目AirtestProject/Airtest
就被複制到我們自己的倉庫裏面了,命名爲你的用戶名/Airtest
:
這個 Fork
後的項目是我們自己賬戶上的項目,所以我們可以隨意修改,且並不會影響到真正的AirtestProject/Airtest
項目的。下面我們把它稱之爲子倉庫。原始項目的那個倉庫,在下文我們稱之爲主倉庫。
clone子倉庫到本地
在本地目錄下,右鍵Git Bush Here
,輸入以下命令把自己賬戶上fork
得到的倉庫(子倉庫)clone
到本地:
# Clone 到本地的項目目錄
git clone https://github.com/your-user-name/Airtest Airtest
切換到某個分支
進入剛纔clone
好的Airtest
目錄,右鍵Git Bush Here
,默認進去的是master
分支。如果我們是在別的分支上做了改動,比如aaa分支,就可以輸入以下命令切換到aaa分支:
# 創建並切換到 aaa 分支
git checkout -b aaa
提交修改到本地倉庫
想要提交本地aaa分支上的修改,我們可以使用以下命令將提交修改到本地倉庫上:
# 添加修改過的文件
git add 文件名
# 提交commit
git commit -m "改動的描述"
# 可以使用下述命令添加所有文件
git add -A
同步主倉庫的更新
提交commit
之後,我們並不能馬上push
代碼,還需要同步主倉庫上的更新;因爲這部分的內容比較複雜,所以我們需要先來理解一些概念:
-
在對子倉庫修改的過程中,如果主倉庫進行了修改更新,子倉庫是不知道且不會同步的
-
在主倉庫進行了修改更新的情況下,如果子倉庫沒有同步這部分改動而堅持向主倉庫發起
pull request
,很可能會被主倉庫的管理員拒絕 -
origin
是用來向子倉庫提交更新的遠程倉庫,Git會默認把origin
與你的子倉庫關聯在一起,可以通過git remote -vv
查看 -
用來同步主倉庫更新的遠程倉庫,則需要我們手動進行添加,可以將其命名爲
upstream
或是其它你喜歡的名字,還可以通過git remote -v
查看倉庫之間的關聯
瞭解了上述的概念之後,我們假設已經手動添加了upstream
,並且upstream
已經更新了很多提交,我們就可以用以下的方式拉取併合並upstream
上的更新:
# ①切換到 master 分支
git checkout master
# ②使用 rebase 模式拉取 upstream/master 上的更新,然後與本地的master合併
git pull --rebase upstream master:master
# ③切換到 aaa 分支
git checkout aaa
# ④使用 rebase 模式合併本地的 aaa 和 master 分支
git rebase master
或者我們還可以使用下面這種方式拉取合併upstream的更新:
# ①切換到 master 分支
git checkout master
# ②獲取 upstream 上的 master 分支
git fetch upstream master
# ③切換到 aaa 分支
git checkout aaa
# ④使用 rebase 模式合併本地的 aaa 和 upstream/master 分支
git rebase upstream/master
將修改的代碼push到子倉庫上
完成了上述的更新合併以後,我們纔可以把代碼push
到子倉庫上:
# 將本地 aaa 分支的代碼 push 到 origin 的 aaa 分支
git push origin aaa
向主倉庫發起pull request
push
代碼以後,會跳出GitHub網站的登錄彈窗,登陸後會智能識別並彈出按鈕 Compare & pull request
,點擊後填寫一些信息即可向主倉庫發起pull request
。
需要注意的是,主倉庫的開發人員收到你的申請以後,他們還會對你的改動進行審覈(即像上一篇推文講述的那樣,把你的代碼拉取到本地測試一下),只有審覈通過纔會真正被merge
到主倉庫上。
舉個例子,在我們Airtest
項目下,有一個項目支持設備列表的文檔 https://github.com/AirtestProject/Airtest/blob/master/docs/wiki/platforms.md ,但是因爲設備很多,我們更新不過來,所以有一些熱心的用戶,就會在自己本地fork
的項目上面修改了這個platforms.md
文檔,然後再向我們發起一個pull request
:
項目的管理員收到這個pull request
之後,就會查看用戶修改了什麼地方:
如果這個用戶的pull request
沒有問題,Airtest
的項目管理員就會 merge
這個pull request
到主倉庫上。至此,該用戶就可以成爲github上面3k star項目的contributor啦!