读懂十行代码不如自己亲自上手编写一行!代码想熟练最好的方法就是能够通过代码解决工作中的实际问题,例如完成UI自动化测试、接口测试、创建测试数据、构建测试环境、清理数据环境等等。上述这些场景我们都可以从把要解决的问题封装成函数开始,例如我用ui自动化进行登陆,可以把登陆的几行代码封装成函数login(p_user,p_pwd),做接口测试可以把常用的get和post方法封装成 get(p_url)和post(p_url,p_data)。在这里我会详细的讲解python中关于函数的基础知识,最后以selenium 进行百度搜索为例来讲解自动化测试中如何把具体业务封装成方法实现代码复用,相信大家一定会有所收获!
函数基础知识
函数的本质就是代码复用,在面向对象中把函数称为方法。Python提供了许多内建函数,比如
print()。我们也可以自己创建函数,这被叫做用户自定义函数。以下是函数定义的简单规则:
- 函数代码块以def关键词开头,后接函数标识符名称和圆括号()。
- 圆括号之间用于定义参数。
- 函数内容以冒号起始,并且缩进。
- return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回None
例如:
- def func():
- print("函数实例")
- func()
输出结果是:
函数实例
函数的参数
形参和实参
定义一个带参数的函数,如下:
- def func_para(p_str):
- print(p_str)
在函数func_para中,p_str就是一个形参,也就是形式参数,是用来接收调用函数时传入的参数,你传的是什么它就是什么。实参就是实际参数,在调用函数的时候,传递是Kevin,那么Kevin就是实参,传递的是Mike,那么Mike也是实参,实参传递给函数后,会赋值给函数中的形参
把实参Kevin,赋值给函数,即func_para(“Kevin”),输出结果是Kevin
把实参Mike,赋值给函数,即func_para(“Mike”),输出结果是Mike
函数的返回值
调用方运行函数会得到一个值。首先说明,所有的函数都是有返回值的,如果编程人员没有指定返回值,那默认会返回None。
例如:
- def func_return(p_str):
- return p_str
- str=func_return (“Kevin”)print(str)
运行结果
Kevin
函数高级用法
以上是python中函数最基础的定义,相信绝大多数同学都知道,接下来我会给大家介绍一些在python中函数的高级用法
参数的默认值
python允许我们给函数的形参设置一个默认值,不传参数调用的话,就统一默认是这个值。
- def func_default(name='kevin'):
- print("名字是"+name)
- func_default()
- func_default("mike")
输出:
名字是kevin
名字是mike
关键字参数
关键字参数让你可以不用考虑函数的参数位置,你需以键值对的形式指定参数的对应形参。
- def func_key(name,age):
- print("你好"+ name+", 你的年龄是"+age+" !")
- func_key(age='38',name='kevin')
输出:
你好kevin, 你的年龄是38 !
不固定长度参数
有时候我们需要允许用户提供任意数量的参数,函数的形参可以带个星号来接收,不管调用函数的时候传递了多少实参,都将被收集到形参这个变量当中,形参的类型是元组。例如:
- def fun_unfixedlength_1 (*args):
- print(args)fun_unfixedlength_1 ('kevin','38','67674297')
输出
('kevin', '38', '67674297')
还有一种是带两个星号的形参,用于接收键值对形式的实参,导入到函数中的类型是字典。
- def fun_unfixedlength_2 (**args):
- print(args)fun_unfixedlength_2(name='kevin',age='38',qq='67674297')
输出
{'name': 'kevin', 'age':'38', 'qq': '67674297'}
匿名函数
匿名函数就是不用走正常函数定义的流程,可以直接定义一个简单的函数并把函数本身赋值给一个变量,使得这个变量可以像函数一样被调用,在python中可以用lambda关键字来申明定义一个匿名函数。例如
- lambda_demo = lambda first_name,last_name : first_name + " "+last_name
- name = lambda_demo('kevin','li')
- print(name)
输出kevin li
函数实际应用
最后我结合ui自动化测试给大家举一个函数在测试工作中的实际应用。我们以selenium 进行百度搜索为例,selenium的核心代码如下:
- driver.get("https://www.baidu.com/")
- driver.find_element_by_id("kw").clear()
- driver.find_element_by_id("kw").send_keys("selenium") #输入框输入selenium
- driver.find_element_by_id("su").click() #点击搜索按钮
备注:我的头条中有很多文章讲解了关于selenium应用的具体方法,在这里就不再赘述了。可以参考:
一文搞定Java和Python在Selenium3中的应用
Selenium原理精讲
场景分析:由于搜索的关键字是千变万化的,而进行搜索的动作是固定的,即:打开百度网页>在输入框输入关键字>点击百度一下搜索按钮。所以我们可以把该场景编写为函数,用一个函数来处理进行各种关键字搜索的需求。核心代码实现如下:
- def baidu_search(p_key):
- driver.get("https://www.baidu.com/")
- driver.find_element_by_id("kw").clear()
- driver.find_element_by_id("kw").send_keys(p_key) # 输入框输入selenium
- driver.find_element_by_id("su").click() # 点击搜索按钮
如果大家想通过函数来检查是否找到了需要搜索的关键字,那么可以对函数进行改进,如果在搜索结果页面中出现了“百度为您找到相关结果约*个”的文字证明搜索到了关键字返回True,否则返回
False,如下图所示:
改进后的代码方法如下:
- def baidu_search(p_key):
- driver.get("https://www.baidu.com/")
- driver.find_element_by_id("kw").clear()
- driver.find_element_by_id("kw").send_keys(p_key) # 输入框输入selenium
- driver.find_element_by_id("su").click() # 点击搜索按钮
- time.sleep(3)
- try:
- result=driver.find_elements_by_class_name("nums_text").get_attribute('value') #获取搜索结果的统计个数值,默认是:百度为您找到相关结果约...个
- if re.match('百度为您找到相关结果约.*个', result)is None: #通过正则进行匹配,没匹配到正则返回None
- return False
- else:
- return True
- exceptNoSuchElementException as e:
- return False
- return True