白盒自動化平臺日記7:開發第二個子模塊-用例生成-整合

上回我們梳理通了大體思路,漏掉了一個代入樁模塊,完整如下:
從前端用戶保存內容中-拿到源碼—整合等號—代入樁模塊—解析成特殊代碼行—代入覆蓋率公式—對結果賦值和清洗—最終展示到前端頁面上
其中代入樁模塊是把用戶的所有保存的樁模塊的key-value,都給替換上。不過這裏有難度,所以我們暫時忽略這一步,最後再做。
我們這次來一起研究整合等號。
爲什麼要研究等號,等號在代碼裏就是賦值,或者說引用。在我們之後對公式結果給實際的值的時候,必然要知道這些個變量,到底是什麼?不然我們怎麼給值?比如一個函數只有一個入參a,結果我們公式結果是c>5,這時候我們怎麼通過給a賦值來 讓c>5呢? 答案是不可能,除非我們知道c和a的關係。它們的關係,是跑不出含有等號的代碼行的。當然這裏我們延伸一個忽略的問題: for i in [] 中這個i,怎麼處理,暫時我能想到的是i不受我們入參控制,只需要不斷的遍歷後面列表中元素即可,而後面列表中的元素纔是我們要整合的,比如:

def xxx(a):
	c = a+1
	for i in [c,10]:
		print ''

這裏我們不對i進行整合,只對[c,10進行整合] 但是其中的c是什麼?我們發現入參只有a,所以要找到c = a+1 這句話,然後把循環改成:for i in [a+1,10] ,但是考慮到情況極爲複雜。
比如如下賦值:

c=b+1
c=c+2
if c>5:
    raise c = 15

這其中,c=c+2會覆蓋掉b+1,所以存儲替換規則的容器最好是字典,方便更新覆蓋。所以我們遍臨這個代碼,第一句結束後,替換規則容器 應該是: {“c”:“b+1”} , 難點來了,第二句c=a+2 應該如何替換? 替換成b+1=b+1+2? 顯然是不對的。正確的應該是{“c”:“b+1+2”} 所以我們應該知道 = 號左邊是不應該進行替換的,聯想到

c=b+1
c+=2

這種特殊簡寫,也會直接打亂我們的設想,所以針對+= -= …(這裏不知道會有多少,所以只能先寫這倆個,但是要註釋好,之後可以隨時添加).我們要更先一步進行詳寫,變換成c=c+2,進而判斷包含=號,然後變換成c=b+1+2,最後更新{“c”:“b+1+2”} ,然後接下來判斷if c>5 替換成:if b+1+2 >5
那麼是不是 所有包含=賦值,除去==的代碼,都是=號左邊不替換呢?
不完全是:比如再下面的一句代碼:

raise c = 15

這裏只含一個等號,但是我們仍然要給它替換上,因爲這句話不是賦值,而是斷言,不會改變c的值。我目前只發現=號 且 不含raise的情況 是賦值,是會改變變量本身的。

我們整個語句覆蓋-python的底層代碼中,獨立寫這個整合函數,主函數只需要調用即可:主函數如下:
在這裏插入圖片描述其中 ut_2_yjfg_python_zh() 就是整合函數
整合函數如下:
在這裏插入圖片描述
這個函數會不斷進行更新補充,畢竟代碼千奇百怪,我只考慮了常見情況。
先來給大家看看效果:
這是目標代碼原始:
在這裏插入圖片描述
其中錯綜複雜,各種引用 賦值。不要懷疑,這些寫法都不會報錯。
這是經過整合函數處理過的:
在這裏插入圖片描述
其中ready字典是存儲最新的各個變量的最新值,以備後用。
下面輸出的就是整合之後的樣子。
def panduan(a) :不做任何改變
c=5 :仍然是c=5
a=3+c :變爲a = 3+(5) ,括號不影響計算,而且會保證計算順序的安全!
s=c+2+a :變爲s = (5)+2+(3+(5))
d = c5 :變爲 d = (5)5
f = m =c == 5 :變爲f= (5)5 和 m= (5)5
if c
1-s: 變爲 if (5)
1-((5)+2+(3+(5))):
print a>5 :變爲 print (3+(5)) > 5
print a
5 :變爲 print (3+(5))5
其中涉及異常情況過多,所以從這開始,白盒自動化真正的難點就來了。我們需要徹底瞭解python的運行機制,順序,邏輯。才能補充完整這個整合函數。
我們最終把這個函數變爲 這個樣子後,就會發現,比如那個if c
1-s: 一開始我們很難確定怎麼才能 爲真或爲假,現在好了。轉變成了
if (5)
1-((5)+2+(3+(5))):
這很顯然是假的,所以下面的print永遠都不可能走到,這種可以給開發同學說說了。當然,更多的情況是整合後if 中只含有個a,也就是隻含有入參a,這時我們就可以通過控制入參a,來控制if是否真,控制print是否可以執行了。

最後,點擊這裏返回到目錄:
python白盒單元自動化算法,自動生成語句覆蓋/路徑覆蓋等邏輯覆蓋用例-持續更新中

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章