• 内部UI自动化测试培训之python基础


    image

    这个文档的由来是公司内部UI自动化测试培训的资料。部门为了减少测试工作量,准备做UI自动化测试。我写python,其他同事都是java,所以python基础和UI自动化测试selenium的培训就由我来完成。
    完整教程包括4篇内容,本篇是python的基础内容,高手请跳过。虽然是基础,但是可以看做是一个python的微型教程,如果想了解python,简单上手尝试,这个教程适合。

    UI 自动化测试相关内容:

    1|0前言


    Python 是一门上手非常快的语言,学习python这门编程语言达到能够正常使用的程度,需要掌握的点包括:

    1. 语言基础特性
    2. 数据类型
    3. 流程控制
    4. 函数调用
    5. 面向对象
    6. 模块与包

    下面从这6个方面来快速熟悉python语言

    2|0语言基础特性


    2|1解释性语言


    程序执行原理:
    计算机不能直接理解高级语言,只能理解和运行机器语言,所以必须要把高级语言翻译成机器语言,计算机才能运行高级语言所编写的程序。

    编译型:
    程序在执行之前需要一个专门的编译过程,把程序编译成为机器语言的文件,运行时不需要重新翻译,直接使用编译的结果就行了。
    编译型语言:
    C/C++、Golang。典型的就是C语言可以编译后生成可执行文件,之后无需再次编译,直接运行可执行文件即可。

    解释型:
    程序不需要编译,程序在运行时才翻译成机器语言,每执行一次都要翻译一次。因此效率比较低。
    解释型语言:
    C#、PHP、JavaScript、Perl、Python、Ruby 等等

    Python 是一个解释性语言,Python解释器首先会将python程序编译成中间文件 .pyc 文件,然后解释器执行pyc文件。

    2|2优缺点


    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所采用的脚本语言的应用范围更广泛

    2|3性能问题


    python最大的问题就是性能问题,可以参考如下性能测试。

    但是python并不是不能支持大型项目。比如facebook的很多大型后台服务都是python项目。

    Twitter 劲敌 Threads,“魔改”了哪些 Python 技术栈?

    新手小提示:如果在此之前没有接触过python编程,想要尝试复现本教程中的示例,可以通过如下几步:

    1. 找到一个linux服务器
    2. 在命令行中输出python3,进入python解释器中
    3. 逐条输入代码

    3|0数据类型


    Python 有数据类型,但是变量定义时不需要指定变量的类型。格式:

    变量 = 数值

    对比java,C++等需要指明变量的类型

    int d = 3

    3|1数值


    整型:可以存储无限大的数字,理论上没有上限

    >>> 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)

    3|2字符串


    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'
    >>>

    3|3列表


    列表是一种容器类型,类似于数组,按照顺序排序元素。但是存入的元素没有数据类型的约束,可以是任意类型。
    特点:无限长度、可以存入任意类型的数据结构

    创建:使用中括号创建列表

    >>> 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]

    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)
    >>>

    3|5字典


    字典也是一种容器类型,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 "", line 1, in 
    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)
    >>>

    3|6集合


    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}

    4|0流程控制


    4|1条件判断


    python使用if关键字做条件判断,语法特点:

    1. 使用缩进对齐来确定代码块
    2. 使用冒号标志结束
    >>> age = 20
    >>> if age >= 18:
    ...     print("成年人")
    ... else:
    ...     print("未成年人")
    ...
    成年人

    4|2循环语句


    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
    
    
    

    5|0函数调用


    函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。函数能提高应用的模块性,和代码的重复利用率。

    5|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关键字开始,冒号结束。函数代码块以统一缩进标识。

    5|2函数返回


    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

    如上示例返回两个值,函数调用时也需要用两个值接收,否则会抛出异常。

    6|0面向对象


    6|1类和实例


    使用关键字class定义,class后面紧接着是类名。类名通常是大驼峰命名

    class Person(object):
        pass

    object 是Student继承的类,如果没有继承任何类可以省略括号以及里面的内容。

    6|2实例


    类是抽象的模板,比如Person类,而实例是根据类创建出来的一个具体的对象。python不需要任何关键字就能实例化一个对象,使用函数调用的方法就能创建一个实例。

    one_person = Person()

    6|3属性


    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}")

    6|4方法


    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()

    6|5构造方法


    在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+"岁。";
        }
    }

    7|0模块与包


    7|1模块


    python中代码是通过模块和包管理的。
    一个 py 文件就是一个模块。

    7|2


    包是保存几个模块的文件夹,包中通常包含几个py文件和一个__init__.py的特殊文件。__init__.py 用于标识该文件夹是一个包。

    Python 网络请求最常用的库requests目录赏析,每一个包的目录下面都有一个__init__.py文件。

    8|0安装第三方包


    安装第三方包,炫酷进度条。

    pip install alive-progress
    from alive_progress.styles import showtime # 使用from import关键字导入模块
    showtime()

    python基础知识介绍到这里就结束了,UI自动化测试Selenium请参考另一篇 selenium 开源UI测试工具


    __EOF__

    本文作者goldsunshine
    本文链接https://www.cnblogs.com/goldsunshine/p/18056448.html
    关于博主:评论和私信会在第一时间回复。或者直接私信我。
    版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
    声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
  • 相关阅读:
    7.Flask-Migrate数据库迁移
    从零开始学安卓笔记:添加ImageButton后APP闪退问题记录
    【Spark NLP】第 11 章:词嵌入
    精解四大集合框架:List 核心知识总结
    算法金 | 再见!!!KNN
    java_Springboot_Mybatis-Plus_自定义多数据源MybatisSqlSessionFactoryBean配置
    Qt之使用QTreeView实现QQ登录好友列表
    QML 如何显示文本?Text可以有多少功能?
    面试SQL语句,学会这些就够了!!!
    Node版本管理工具——Nvm
  • 原文地址:https://www.cnblogs.com/goldsunshine/p/18056448