這個文件的由來是公司內部UI自動化測試培訓的資料。部門為了減少測試工作量,準備做UI自動化測試。我寫python,其他同事都是java,所以python基礎和UI自動化測試selenium的培訓就由我來完成。
完整教程包括4篇內容,本篇是python的基礎內容,高手請跳過。雖然是基礎,但是可以看做是一個python的微型教程,如果想了解python,簡單上手嘗試,這個教程適合。
UI 自動化測試相關內容:
- 內部UI自動化測試培訓之什麼是UI自動化測試
- 內部UI自動化測試培訓之python基礎
- 內部UI自動化測試培訓之seleniumUI測試工具
- 內部UI自動化測試培訓之unittest基礎
前言
Python 是一門上手非常快的語言,學習python這門程式語言達到能夠正常使用的程度,需要掌握的點包括:
- 語言基礎特性
- 資料型別
- 流程控制
- 函式呼叫
- 物件導向
- 模組與包
下面從這6個方面來快速熟悉python語言
語言基礎特性
解釋性語言
程式執行原理:
計算機不能直接理解高階語言,只能理解和執行機器語言,所以必須要把高階語言翻譯成機器語言,計算機才能執行高階語言所編寫的程式。
編譯型:
程式在執行之前需要一個專門的編譯過程,把程式編譯成為機器語言的檔案,執行時不需要重新翻譯,直接使用編譯的結果就行了。
編譯型語言:
C/C++、Golang。典型的就是C語言可以編譯後生成可執行檔案,之後無需再次編譯,直接執行可執行檔案即可。
解釋型:
程式不需要編譯,程式在執行時才翻譯成機器語言,每執行一次都要翻譯一次。因此效率比較低。
解釋型語言:
C#、PHP、JavaScript、Perl、Python、Ruby 等等
Python 是一個解釋性語言,Python直譯器首先會將python程式編譯成中間檔案 .pyc 檔案,然後直譯器執行pyc檔案。
優缺點
- WEB開發——最火的Python web框架Django, 支援非同步高併發的Tornado框架,短小精悍的flask,bottle。
- 網路程式設計——支援高併發的Twisted網路框架, py3引入的asyncio使非同步程式設計變的非常簡單
- 爬蟲——爬蟲領域,Python幾乎是霸主地位,Scrapy\Request\BeautifuSoap\urllib等,想爬啥就爬啥
- 雲端計算——目前最火最知名的雲端計算框架就是OpenStack,Python現在的火,很大一部分就是因為雲端計算
- 人工智慧—— Python 是目前公認的人工智慧的必備語言,pytorch和tensorflow等框架都是用python編寫
- 自動化運維 devops ——問問中國的每個運維人員,運維人員必須會的語言是什麼?10個人相信會給你一個相同的答案,它的名字叫Python
- 金融分析——金融行業寫的好多分析程式、高頻交易軟體就是用的Python。到目前Python是金融分析、量化交易領域裡用的最多的語言
- 科學運算—— 97年開始,NASA就在大量使用Python在進行各種複雜的科學運算,隨著NumPy, SciPy, Matplotlib, Enthought librarys等眾多程式庫的開發,使的Python越來越適合於做科學計算、繪製高質量的2D和3D影像。和科學計算領域最流行的商業軟體Matlab相比,Python是一門通用的程式設計語言,比Matlab所採用的指令碼語言的應用範圍更廣泛
效能問題
python最大的問題就是效能問題,可以參考如下效能測試。
但是python並不是不能支援大型專案。比如facebook的很多大型後臺服務都是python專案。
Twitter 勁敵 Threads,“魔改”了哪些 Python 技術棧?
新手小提示:如果在此之前沒有接觸過python程式設計,想要嘗試復現本教程中的示例,可以透過如下幾步:
- 找到一個linux伺服器
- 在命令列中輸出python3,進入python直譯器中
- 逐條輸入程式碼
資料型別
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關鍵字做條件判斷,語法特點:
- 使用縮排對齊來確定程式碼塊
- 使用冒號標誌結束
>>> 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測試工具