內部UI自動化測試培訓之python基礎

金色旭光發表於2024-03-07

image

這個文件的由來是公司內部UI自動化測試培訓的資料。部門為了減少測試工作量,準備做UI自動化測試。我寫python,其他同事都是java,所以python基礎和UI自動化測試selenium的培訓就由我來完成。
完整教程包括4篇內容,本篇是python的基礎內容,高手請跳過。雖然是基礎,但是可以看做是一個python的微型教程,如果想了解python,簡單上手嘗試,這個教程適合。

UI 自動化測試相關內容:

  • 內部UI自動化測試培訓之什麼是UI自動化測試
  • 內部UI自動化測試培訓之python基礎
  • 內部UI自動化測試培訓之seleniumUI測試工具
  • 內部UI自動化測試培訓之unittest基礎

前言

Python 是一門上手非常快的語言,學習python這門程式語言達到能夠正常使用的程度,需要掌握的點包括:

  1. 語言基礎特性
  2. 資料型別
  3. 流程控制
  4. 函式呼叫
  5. 物件導向
  6. 模組與包

下面從這6個方面來快速熟悉python語言

語言基礎特性

解釋性語言

程式執行原理:
計算機不能直接理解高階語言,只能理解和執行機器語言,所以必須要把高階語言翻譯成機器語言,計算機才能執行高階語言所編寫的程式。

編譯型:
程式在執行之前需要一個專門的編譯過程,把程式編譯成為機器語言的檔案,執行時不需要重新翻譯,直接使用編譯的結果就行了。
編譯型語言:
C/C++、Golang。典型的就是C語言可以編譯後生成可執行檔案,之後無需再次編譯,直接執行可執行檔案即可。

解釋型:
程式不需要編譯,程式在執行時才翻譯成機器語言,每執行一次都要翻譯一次。因此效率比較低。
解釋型語言:
C#、PHP、JavaScript、Perl、Python、Ruby 等等

Python 是一個解釋性語言,Python直譯器首先會將python程式編譯成中間檔案 .pyc 檔案,然後直譯器執行pyc檔案。

優缺點

  1. WEB開發——最火的Python web框架Django, 支援非同步高併發的Tornado框架,短小精悍的flask,bottle。
  2. 網路程式設計——支援高併發的Twisted網路框架, py3引入的asyncio使非同步程式設計變的非常簡單
  3. 爬蟲——爬蟲領域,Python幾乎是霸主地位,Scrapy\Request\BeautifuSoap\urllib等,想爬啥就爬啥
  4. 雲端計算——目前最火最知名的雲端計算框架就是OpenStack,Python現在的火,很大一部分就是因為雲端計算
  5. 人工智慧—— Python 是目前公認的人工智慧的必備語言,pytorch和tensorflow等框架都是用python編寫
  6. 自動化運維 devops ——問問中國的每個運維人員,運維人員必須會的語言是什麼?10個人相信會給你一個相同的答案,它的名字叫Python
  7. 金融分析——金融行業寫的好多分析程式、高頻交易軟體就是用的Python。到目前Python是金融分析、量化交易領域裡用的最多的語言
  8. 科學運算—— 97年開始,NASA就在大量使用Python在進行各種複雜的科學運算,隨著NumPy, SciPy, Matplotlib, Enthought librarys等眾多程式庫的開發,使的Python越來越適合於做科學計算、繪製高質量的2D和3D影像。和科學計算領域最流行的商業軟體Matlab相比,Python是一門通用的程式設計語言,比Matlab所採用的指令碼語言的應用範圍更廣泛

效能問題

python最大的問題就是效能問題,可以參考如下效能測試。

但是python並不是不能支援大型專案。比如facebook的很多大型後臺服務都是python專案。

Twitter 勁敵 Threads,“魔改”了哪些 Python 技術棧?

新手小提示:如果在此之前沒有接觸過python程式設計,想要嘗試復現本教程中的示例,可以透過如下幾步:

  1. 找到一個linux伺服器
  2. 在命令列中輸出python3,進入python直譯器中
  3. 逐條輸入程式碼

資料型別

Python 有資料型別,但是變數定義時不需要指定變數的型別。格式:

變數 = 數值

對比java,C++等需要指明變數的型別

int d = 3

數值

整型:可以儲存無限大的數字,理論上沒有上限

>>> score = 100
>>> print(score)
100

浮點型:沒有精度限制

>>> pi = 3.1415926
>>> print(pi)
3.1415926

布林:用True和False表示布林型別。True可以當成數值1來用,False可以當成0來用

>>> is_vip = True
>>> 
>>> print(is_vip)
True


>>> has_error = False
>>> has_error == 0
True

複數:一個實數和一個虛陣列合構成,表示為:x+yj

>>> a = 100+50j
>>> print(a)
(100+50j)

字串

string = "hello world"

訪問:使用下標直接訪問字串中的特定字元。可以正索引,也可以負索引

string = "hello world"

>>> string = "hello world"
>>> string[1]
'e'
>>> string[-1]
'd'
>>>

切片:所謂切片就是獲取序列的一個連續子序列。字串切片語法是:[start:end],取到的範圍是下標start開始到end-1,也就是所謂的左閉右開

>>> string[1:4]
'ell'
>>> string[1:]
'ello world'
>>> string[1:100]
'ello world'
>>>

列表

列表是一種容器型別,類似於陣列,按照順序排序元素。但是存入的元素沒有資料型別的約束,可以是任意型別。
特點:無限長度、可以存入任意型別的資料結構

建立:使用中括號建立列表

>>> arr = [1, 2, 3, 4, 5]
>>> arr
[1, 2, 3, 4, 5]

訪問:可以索引訪問,支援切片,支援負索引,支援按步長訪問

# 索引
>>> arr
[1, 2, 3, 4, 5]
>>> arr[1]
2
# 切片
>>> arr[1: -1]
[2, 3, 4]
>>>
>>> arr[:3]
[1, 2, 3]
>>>
# 按步長訪問,訪問下標0-8的元素,步長為2
>>> arr = [1,2,3,4,5,6,7,8,9]
>>> arr[0:9:2]
[1, 3, 5, 7, 9]

新增:append 在尾部追加 ;insert 在任意下標插入資料

>>> arr
[1, 2, 3, 4, 5]
>>> arr.append(10)
>>> arr
[1, 2, 3, 4, 5, 10]
>>>
>>> arr.insert(0, -1)
>>> arr
[-1, 1, 2, 3, 4, 5, 10]

刪除:pop()刪除佇列末尾; pop(index)刪除指定下標; remove(value) 刪除指定值

>>> arr
[-1, 1, 2, 3, 4, 5, 10]
>>> arr.pop()
10
>>> arr.pop(0)
-1
>>> arr.remove(5)
>>> arr
[1, 2, 3, 4]

元組

元組和列表類似,但是元組是不可修改,刪除元素。
特點:不可刪除和修改元素,是不可變序列

建立:建立一個元組有兩種方法,分別是小括號和tuple關鍵字

>>> num = (10, 20, 30, 40, 50)
>>> num
(10, 20, 30, 40, 50)
>>> type(num)
<class 'tuple'>
>>>

>>> list1 = ["python", "java", "C++"]
>>> tup1 = tuple(list1)
>>> tup1
('python', 'java', 'C++')
>>>

訪問:可以透過下標和切片的方式訪問元組

>>> num
(10, 20, 30, 40, 50)
>>> num[1]
20
>>> num[1:10]
(20, 30, 40, 50)
>>>

字典

字典也是一種容器型別,java中叫hashmap,是由鍵值對組成的資料結構。
特點:訪問時間複雜度為常數
建立:透過大括號和dict關鍵字都可以建立字典

>>> p_dict = {"name": "xiaozhang", "age": 18, "finish_course": False}
>>>
>>> p_dict
{'name': 'xiaozhang', 'age': 18, 'finish_course': False}

訪問:字典透過key來訪問value,一共有兩種訪問方式[]和get方法。

>>> p_dict["name"]
'xiaozhang'

# 取不到值會報錯
>>> p_dict["height"]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'height'

# 取不到值不會報錯
>>> p_dict.get("age")
18
>>> p_dict.get("height")
>>> p_dict.get("height", 0)
0

新增:兩種新增方法,增加keyvalue鍵值對和更新另一個字典

>>> p_dict["height"] = 180
>>>
>>> p_dict.update({"phone": 12306})
>>>
>>>
>>> p_dict
{'name': 'xiaozhang', 'age': 18, 'finish_course': False, 'height': 180, 'phone': 12306}

刪除:兩種刪除方法,pop刪除指定key,popitem()隨機刪除一個

>>> p_dict.pop("age")
18
>>> p_dict.popitem()
('phone', 12306)
>>>

集合

python中的集合,和數學中的集合概念一樣,用來儲存不重複的元素,即集合中的元素都是唯一的,互不相同。
特點:元素不重複,只能儲存不可變的資料型別,包括整形、浮點型、字串、元組,無法儲存列表、字典、集合這些可變的資料型別。
建立:
從形式上看,和字典類似,Python 集合會將所有元素放在一對大括號 {} 中,相鄰元素之間用“,”分隔,如下所示:

>>> set1 = {1,2,3,4,5}
>>> set1
{1, 2, 3, 4, 5}
>>> type(set1)
<class 'set'>

訪問:集合不支援單個元素訪問,可以遍歷全部
新增:使用add新增元素

>>> set1.add(100)
>>> set1
{1, 2, 3, 4, 5, 100}

刪除:使用remove刪除指定值,如果不存在該值會丟擲異常

>>> set1.remove(4)
>>> set1
{1, 2, 3, 5, 100}

集合操作:集合支援數學意義上的集合的操作,包括:兩個集合取交集、差集、並集、補集

# 差集

>>> set1 = {1, 2, 3}
>>> set2 = {1, 4, 5}
>>> set1 - set2
{2, 3}

# 並集
>>> set1 | set2
{1, 2, 3, 4, 5}

# 補集
>>> set1 ^ set2
{2, 3, 4, 5}

# 交集
>>> set1 & set2 
{1}

流程控制

條件判斷

python使用if關鍵字做條件判斷,語法特點:

  1. 使用縮排對齊來確定程式碼塊
  2. 使用冒號標誌結束
>>> age = 20
>>> if age >= 18:
...     print("成年人")
... else:
...     print("未成年人")
...
成年人

迴圈語句

python只有兩種迴圈語法,分別是for迴圈和while迴圈,沒有do while這種語法

for迴圈

python中的for迴圈使用in這個關鍵字,從待迴圈的容器中取出每一個元素,賦值給迴圈標識i

>>> ikun = ["雞", "你", "太美"]
>>> for i in ikun:
...     print(i)
...
雞
你
太美

java for迴圈和python for迴圈對比

public class Test {
   public static void main(String[] args) {
 
      for(int x = 0; x < 20; x = x+1) {
         System.out.print(x);
      }
   }
}
>>> print(list(range(20)))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]

for i in range(20):
    print(i)

java for迴圈是讓變數x不斷自增,直到大於20退出迴圈,python for迴圈是range(20)生成一個從0到19的容器,每次取出一個元素賦值給i。

while

while 遇到條件不滿足則退出,和其他語言類似

>>> index = 10
>>> while index > 0:
...     print(index)
...     index = index - 1
...
10
9
8
7
6
5
4
3
2
1


函式呼叫

函式是組織好的,可重複使用的,用來實現單一,或相關聯功能的程式碼段。函式能提高應用的模組性,和程式碼的重複利用率。

函式定義

def get_vip(score):
    if not isinstance(score, int):
       print("輸入不是數字")
       return
    if score >= 60:
        return True
    else:
        return False

is_vip = get_vip(88)
print(is_vip)
>>>
True

定義函式透過def關鍵字開始,冒號結束。函式程式碼塊以統一縮排標識。

函式返回

python中函式返回有一個特性:函式可以返回多個值,如:

def get_vip(score):
    is_vip = False
    is_super_vip = False
    if score > 60:
        is_vip = True
    if score > 90:
        is_super_vip = True
    return is_vip, is_super_vip
    
vip, super_vip = get_vip(88) 
>>> vip
True
>>> super_vip
False

如上示例返回兩個值,函式呼叫時也需要用兩個值接收,否則會丟擲異常。

物件導向

類和例項

使用關鍵字class定義,class後面緊接著是類名。類名通常是大駝峰命名

class Person(object):
    pass

object 是Student繼承的類,如果沒有繼承任何類可以省略括號以及裡面的內容。

例項

類是抽象的模板,比如Person類,而例項是根據類建立出來的一個具體的物件。python不需要任何關鍵字就能例項化一個物件,使用函式呼叫的方法就能建立一個例項。

one_person = Person()

屬性

python物件導向中,變數叫做屬性

class Person:
    def __init__(self, name, job):
        self.name = name
        self.job = job
        
name = "馬保國"
job = "渾元形意太極門掌門人"
p = Person(name, job)
print(f"朋友們好啊, 我是{p.job}{p.name}")

方法

python物件導向中,函式叫做方法

class Person:
    def __init__(self, name, job):
        self.name = name
        self.job = job
        
    def say(self):
        print("這兩個年輕人不講武德!來,騙,來偷襲我69歲的老同志。我勸這位年輕人,耗子尾汁")

name = "馬保國"
job = "渾元形意太極門掌門人"
p = Person(name, job)
p.say()

構造方法

在python的類中有一個特殊的方法用於例項建立時初始化,就是構造方法。
類就如同一個模板,透過類建立的例項肯定是千差萬別的。例項在建立時可以傳入屬於自己的屬性,在python中就是透過這個構造方法__init__來實現。

class Person:
    def __init__(self, name, job):
        self.name = name
        self.job = job

在建立例項時傳入name 和 job 兩個引數

name = "馬保國"
job = "渾元形意太極門掌門人"
p = Person(name, job)

後續整個例項都可以使用該初始化的引數

class Person:
    def __init__(self, name, job):
        self.name = name
        self.job = job
    
    def introduce(self):
        print(f"朋友們好啊, 我是{self.job}{self.name}")

對比java中也有構造方法

public class worker{
    public String name;
    public int age;

    public Worker(String name, int age){
        this.name = name;
        this.age = age;
    }
    
    public String toString() {
        return "大家好!我是新來的員工,我叫"+name+",今年"+age+"歲。";
    }
}

模組與包

模組

python中程式碼是透過模組和包管理的。
一個 py 檔案就是一個模組。

包是儲存幾個模組的資料夾,包中通常包含幾個py檔案和一個__init__.py的特殊檔案。__init__.py 用於標識該資料夾是一個包。

Python 網路請求最常用的庫requests目錄賞析,每一個包的目錄下面都有一個__init__.py檔案。

安裝第三方包

安裝第三方包,炫酷進度條。

pip install alive-progress
from alive_progress.styles import showtime # 使用from import關鍵字匯入模組
showtime()

python基礎知識介紹到這裡就結束了,UI自動化測試Selenium請參考另一篇 selenium 開源UI測試工具

相關文章