python学习笔记

【python 的基本操作】
变量

#是一种存储数据的载体,计算机中的变量是实际存在的数据或者说是存储器中存储数据的一块内存空间
#变量的值可以被读取和修改
#命名规则:1由字母,数字,下划线组成,数字不能开头 2区分大小写 3不能和关键字(有特殊含义的单词)和系统保留的字(如函数)冲突
a_1=10 #定义一个变量
print(a_1)

数据类型 int又为整型,包括正整数,负整数,0(没有小数)

int_1=10
int_2=-10
print(int_1)
print(int_2)
print(type(int_1)) #type() 是查看数据类型

数据类型
float浮点型(小数类型,带小数点)例如1.2、-3.5

float_1=1.2
print(float_1)
print(type(float_1))

运算符
赋值:= 加减乘除:±*/ 取余:% 乘方:** 修改运算优先级:() 等于:== 不等于:!=

a=1 #赋值
print(a)
print(1+1)  #加法
print(2-1)  #减法
print(1*2)  #乘法
print(4/2)  #除法
print(4%3)  #取余
print(2**4)  #乘方,2的4次方即2*2*2*2
print(2+4*5)
print((2+4)*5)  #修改运算优先级
print(1==1)  #等于
print(1!=2)  #不等于

数据类型
字符串(string)

str_1='abc'
print(str_1)
str_2='123'
print(str_2)
str_3='hdjahfj\n1454565'  #\n是换行
print(str_3)
print(str_1+str_2)  #+是连接字符串
str_4=r'jdkjd\n456355'  #r是忽略转义符的作用
print(str_4)

索引:第一个数是从0开始(不是1)依次往下

#print(a[索引])
print(a[0])
print(a[3])

切片

print(a[1:])
print(a[-1])   #负数是反正取元素
print(a[1:5])  #python有个前闭后开原则
print(a[1:5:2])  #第一个数是start 第二个数是stop 第三个数是步长step,不写时默认是1

数据类型
列表list:使用中括号包起来的元素叫做列表

list_1=[1,2,3,'hd','123']
print(list_1)

#列表的索引和切片和字符串的方法一致

【字符串的基本操作】

单行字符串

str_1='this'
print(str_1)

‘’‘多行字符串’’’

str_2='''my name is
杨洪营
'''
print(str_2)

‘’’\n 换行符’’’

str_3='my name is\n杨洪营'
print(str_3)

‘’‘多加一个\是转义符’’’

str_4='my name is\\n杨洪营'
print(str_4)

‘’‘格式化操作’’’
#%s 字符串格式化符号(可以替换各种格式)
print('my name is %s'%'yang') #相当于yang替换了%s的位置
#%d 整数格式化符号
print('my name is %d'%10)
#%f 浮点数格式化符号
print('my name is%f'%1.5)
#%c 字符及ASCII码格式化符号
#%u 无符号整型
#%o 无符号八进制数
#%x 无符号十六进制数
#%X 无符号十六进制数(大写)
#%e 用科学计数法格式化浮点数
#%p 用十六进制格式化变量的地址

‘’‘format的使用’’’
#方法一

a_1='this is a {}'       #a_1是原始的变量内容
a_2=a_1.format('book')  #a_2是替换过的变量内容
print(a_1)
print(a_2)

#方法二(索引方式)

a_3='this is a {0} {1}'
a_4=a_3.format('good','book')
print(a_4)
a_5='this is a {1} {2}'
a_6=a_5.format('a','good','book')
print(a_6)

#方法三(关键字传参)

a_7='this is a {a}'
a_8=a_7.format(a='book')
print(a_8)

‘’‘f的用法’’’

name='yang'
print(f'my name is {name}')
name_1='hong'
pet='cat'
print(f'my name is {name_1},i like {pet}')

‘’’ .join 列表根据想要的格式拼接为字符串’’’

a=['y','a','n','g']
print(''.join(a))
print('I'.join(a)) #如果想把每个字母隔开,在''里添加

‘’’.split 字符串转化列表’’’

b='y|a|n|g'
print(b.split('|')) #字符串是用什么区分的''里就填什么
c='my name is yang'
print(c.split(' ')) #''里也可以是空格

‘’’.replace 替换’’’

d='my name is 杨'
print(d.replace('杨', '营'))
print(d.replace('my', 'me')) #可以替换任何一个
print(d.replace('m', 'M'))   #也可以替换任何一个字母

‘’’.strip 去掉首尾空格’’’

e=' name '
print(e.strip())

【数据结构-列表】

#列表(list)是有序的可变元素的集合,使用中括号包围,元素之间用逗号分隔
#列表是动态的,可以随时扩展和收缩
#列表是异构的,可以同时存放不同类型的对象(字符串,整数,浮点数,列表,元祖,集合,字典等

li1=['zz',18,1.2,[1,2,3],(1,2,3),{'name':'yang','age':'26'}]
print(li1)

#列表中允许出现重复元素

li2=[1,1,'aa']
print(li2)
li=list()  #创建个空列表
print(li)
li3=list('yang')
print(li3)

‘’‘列表使用-索引’’’
#默认正向索引,编号从 0 开始

li4=[1,2,3,4]
print(li4[0])   #索引0打印是1

#支持反向索引,编号从-1 开始
print(li4[-1]) #索引-1打印是4
‘’‘列表使用:切片[start(开始值):stop(结束值):step(步长)]’’’
#start 值: 指示开始索引值,如果没有指定,则默认开始值为 0
#stop 值: 指示到哪个索引值结束,但不包括这个结束索引值。如果没有指定,则取列表允许的最大索引值
#step 值: 步长值指示每一步大小,如果没有指定,则默认步长值为 1。三个值都是可选的,非必填

li_5=[1,2,3,4,5,6,7,8,9,10]
print(li_5[0:4:2])
print(li_5[2:4])
print(li_5[:4])
print(li_5[2:])
print(li_5[::2])
print(li_5[::-1])

‘’‘列表使用:运算符’’’

# * 运算符可以重复生成列表元素
li_6=[1]
print(li_6*5)
# + 加号运算符,可以将两个列表合
li_7=[1,2,3]
li_8=[4,5,6]
print(li_7+li_8)

‘’‘列表使用:成员检测’’’

#in:检查一个对象是否在列表中,如果在则返回 True,否则返回 False
li_9=[1,2,3]
print(1 in li_9)
print(4 in li_9)
#not in:和in相反
print(1 not in li_9)
print(4 not in li_9)

‘’‘列表方法’’’

.append() 在列表末尾添加新的元素

li_10=[1,2,3]
li_10.append(4)
print(li_10)
print(len(li_10))  #len() 获取列表的个数

.extend() 在列表末尾一次性追加另一个序列的多个值(用心的列表扩展原来的列表)

li_11=[1,2,3]
li_12=[4,5,6]
li_11.extend(li_12)
print(li_11)

.insert() 将对象插入列表中

li_13=[1,2,3,4]
li_13.insert(1,'yang') #意思是在索引1的位置添加'yang'
print(li_13)

.pop() 移除列表中的一个元素,并返回该元素的值

li_14=[1,2,3,4,5]
li_14.pop(2)  #意思是移除列表中索引为2的值3
print(li_14)
li_15=[1,2,3,4]
li_15.pop()
print(li_15)  #()内为空时,默认移除最后一个值

.remove() 删除第一个匹配的元素

li_16=[1,2,3,4,4,5]
li_16.remove(1)  #1这个元素就会被移除
print(li_16)

.sort() 对列表进行升序排序

li_17=[4,6,2,3,1]
li_17.sort()
print(li_17)

.sort(reverse=Ture) 对列表进行降序排序

li_17.sort(reverse=True)
print(li_17)
li_18=['yang','ho','yin','l']
li_18.sort(key=len)   #按照长度升序排序
print(li_18)

.reverse() 反向排序(注意不是降序,是反向)

li_19=[1,3,2,5,6]
li_19.reverse()
print(li_19)

‘’‘列表嵌套’’’

li_20=[[1,2,3],['yang','hong','ying']]
print(li_20[1][2])     #意思是获取列表中第二个元素中索引2的元素
li_20[1].append('go')  #意思是在列表中的第二个元素末尾添加一个'go'元素
print(li_20)

‘’‘列表推导式’’’
#实例:将 1-10 中的所有偶数平方后组成新的列表
#传统的写法

a=[]
for i in range(1,11):
    if i%2==0:
        a.append(i**2)
print(a)

#列表推导式(简单)写法

b=[m**2 for m in range(1,11) if m%2==0]
print(b)
'''
题目:
根据需求编写计算器加法相应的测试用例
在调用每个测试方法之前打印【开始计算】
在调用测试方法之后打印【结束计算】
调用完所有的测试用例最终输出【结束测试】
为用例添加标签
注意:
a、使用等价类,边界值,错误推测法等方法进行用例设计
b、用例中要添加断言,验证结果
c、灵活使用测试装置
'''


#导包,导程序代码里的
import pytest

from pytest_shizhan.script.calculator import Calculator

#整个模块最后打印,清理数据,关闭连接
def teardown_module():
    print('结束测试')

class TestAdd():

    #每个方法前都会打印
    def setup(self):
        print('开始计算')
    #每个方法后都会打印
    def teardown(self):
        print('结束计算')


    #添加标签
    @pytest.mark.P0
    def test_add1(self):
        #实例化
        cal=Calculator()
        #result接收返回值,result是实际结果
        result=cal.add(1,1)
        #预期结果
        expect=2
        #断言
        assert result==expect

    @pytest.mark.P0
    def test_add2(self):
        cal = Calculator()
        result = cal.add(-0.01, 0.02)
        expect = 0.01
        assert result == expect

    @pytest.mark.P0
    def test_add3(self):
        cal = Calculator()
        result = cal.add(10, 0.02)
        expect = 10.02
        assert result == expect

    @pytest.mark.P1
    def test_add4(self):
        cal = Calculator()
        result = cal.add(98.99, 99)
        expect = 197.99
        assert result == expect

    @pytest.mark.P1
    def test_add5(self):
        cal = Calculator()
        result = cal.add(99, 98.99)
        expect = 197.99
        assert result == expect

    @pytest.mark.P1
    def test_add6(self):
        cal = Calculator()
        result = cal.add(-98.99,-99)
        expect = -197.99
        assert result == expect

    @pytest.mark.P1
    def test_add7(self):
        cal = Calculator()
        result = cal.add(-99, -98.99)
        expect = -197.99
        assert result == expect
'''优化代码'''

import pytest

from pytest_shizhan.script.calculator import Calculator
from pytest_shizhan.test_emo.base.base import Base

#整个模块最后打印,清理数据,关闭连接
def teardown_module():
    print('结束测试')

class TestAdd(Base):



    #添加标签
    @pytest.mark.P0
    def test_add1(self):
        #实例化
        cal=Calculator()
        #result接收返回值,result是实际结果
        result=self.cal.add(1,1)
        #预期结果
        expect=2
        #断言
        assert result==expect

    @pytest.mark.P0
    def test_add2(self):
        result = self.cal.add(-0.01, 0.02)
        expect = 0.01
        assert result == expect

    @pytest.mark.P0
    def test_add3(self):
        result = self.cal.add(10, 0.02)
        expect = 10.02
        assert result == expect

    @pytest.mark.P1
    def test_add4(self):
        result = self.cal.add(98.99, 99)
        expect = 197.99
        assert result == expect

    @pytest.mark.P1
    def test_add5(self):
        result = self.cal.add(99, 98.99)
        expect = 197.99
        assert result == expect

    @pytest.mark.P1
    def test_add6(self):
        result = self.cal.add(-98.99,-99)
        expect = -197.99
        assert result == expect

    @pytest.mark.P1
    def test_add7(self):
        result =self. cal.add(-99, -98.99)
        expect = -197.99
        assert result == expect

    @pytest.mark.P1
    def test_add8(self):
        result = self.cal.add(99.01, 0)
        expect = "参数大小超出范围"
        assert result == expect

    @pytest.mark.P1
    def test_add9(self):
        result = self.cal.add(-99.01, -1)
        expect = "参数大小超出范围"
        assert result == expect

    @pytest.mark.P1
    def test_add10(self):
        result = self.cal.add(2, -99.01)
        expect = "参数大小超出范围"
        assert result == expect

    @pytest.mark.P1
    def test_add11(self):
        result = self.cal.add(1, -99.01)
        expect = "参数大小超出范围"
        assert result == expect

    #特殊情况
    @pytest.mark.P1
    def test_add12(self):
        #捕获异常
        #方法一
        try:
            result = self.cal.add('文', 9.3)
        except TypeError as e:
            print(e)
        #方法二
        #with pytest.raises(TypeError) as e:
            #print(e)

#命令行运行用例 通过标签
#pytest 加文件名 -m 加标签
#提示warning是因为标签是自己命名的 应该注册(case里新建文件,名字必须是pytest.ini)
'''
测试用例编写 2
使用参数化实现测试数据的动态传递
整个模块实现一次数据清理
所有用例执行完成,完成日志打印
生成测试报告(添加日志,截图,分类,测试步骤等)
'''
import allure
from pytest_shizhan.test_emo.utils.log_utils import logger

'''优化代码'''

import pytest

from pytest_shizhan.script.calculator import Calculator
from pytest_shizhan.test_emo.base.base import Base

#整个模块最后打印,清理数据,关闭连接
def teardown_module():
    print('结束测试')

allure.feature('相加功能')
class TestAdd(Base):

    @allure.story('相加P0级别用例')
    #添加标签
    @pytest.mark.P0
    @pytest.mark.parametrize('a,b,expect',[
        [1,1,2],
        [-0.01,0.02,0.01],
        [10, 0.02,10.02]
    ],ids=['int','float','int_float'])

    #参数化 当测试步骤完全一致,测试数据不一样的场景使用
    def test_add1(self,a,b,expect):
        logger.info(f'输入数据:{a},{b},期望结果:{expect}')
        with allure.step('步骤1:相加操作'):
        #实例化
        #cal=Calculator()
        #result接收返回值,result是实际结果

            result=self.cal.add(a,b)
        logger.info(f'实际结果:{result}')
        #预期结果
        #expect=2
        #断言
        with allure.step('步骤2:断言'):
            assert result==expect

    @allure.story('相加P1级别用例')
    @pytest.mark.P1
    @pytest.mark.parametrize('a,b,expect',[
        [98.99, 99,197.99],
        [99, 98.99,197.99],
        [-98.99,-99,-197.99],
        [-99, -98.99,-197.99],
        [99.01, 0,"参数大小超出范围"],
        [-99.01, -1,"参数大小超出范围"],
        [2, -99.01,"参数大小超出范围"],
        [1, -99.01,"参数大小超出范围"],

    ],ids=['num1','num2','num3','num4','num5','num6','num7','num8'])
    def test_add4(self,a,b,expect):
        logger.info(f'输入数据:{a},{b},期望结果:{expect}')
        with allure.step('步骤1:相加操作'):
            result = self.cal.add(a,b)
        logger.info(f'实际结果:{result}')
        with allure.step('步骤2:断言'):
            assert result == expect

    @allure.story('异常用例')
    #特殊情况
    @pytest.mark.P1
    @pytest.mark.parametrize('a,b,expect',[
        ['文',9.3,'TypeError']
    ],ids=['demo'])
    def test_add12(self,a,b,expect):
        #捕获异常
          with pytest.raises(eval(expect)) as e:
            print(e)
            result = self.cal.add(a, b)

#命令行运行用例 通过标签
#pytest 加文件名 -m 加标签
#提示warning是因为标签是自己命名的 应该注册(case里新建文件,名字必须是pytest.ini)

#pytest test_add2.py --alluredir ./result
#allure serve ./result