• [技术干货] WebElement的常用属性和方法
    WebElement是WebDriver.find_element()方法返回的一个对象,该对象用来描述Web上的一个元素,比如输入框,按钮等。本节介绍WebElement的常用属性和方法。一、WebElement的常用属性属性属性描述1id标识2size宽高3rect宽高和坐标4tag_name标签名称5text文本内容二、WebElement的常用方法方法方法描述1send_keys()输入内容2clear()清空内容3click()单击4get_attribute()获得属性值5is_selected()是否被选中6is_enabled()是否可用7is_displayed()是否显示8value_of_css_property()css属性值三、代码示例from time import sleepfrom selenium import webdriverfrom selenium.webdriver.common.by import Byclass Testcase: def __init__(self): self.driver = webdriver.Edge() self.driver.get("https://sahitest.com/demo/linkTest.htm") self.driver.maximize_window() #输出属性值 def test_webelement_prop(self): e = self.driver.find_element(By.ID, "t1") print(type(e))#类型:WebElement print(e.tag_name)#标签名:input print(e.rect)#宽高和坐标 print(e.size)#宽高 print(e.text)#文本:可空 #测试方法 def test_webelement_method(self): e=self.driver.find_element(By.ID, "t1") e.send_keys("Hello World")#输入内容 #get_attribute()获取属性值 print(e.get_attribute('type'))#类型:text print(e.get_attribute('name')) print(e.get_attribute('value'))#值:Hello World print(e.value_of_css_property('font'))#字体 print(e.value_of_css_property('color')) #颜色 sleep(2) e.clear()#清空内容 sleep(2) if __name__ == "__main__": testcase=Testcase() testcase.test_webelement_prop() #testcase.test_webelement_method()`
  • [技术干货] Selenium弹框处理
    Selenium中有三种弹框,本文介绍了处理三种弹框的方法一、Selenium三种弹框alert:用来提示,显示一个带有指定消息和确认按钮的警告框confirm:用于确认,显示一个带有指定消息和确定及取消按钮的对话框prompt:用于用户输入内容,显示可进行输入的对话框这三种弹框不是html的页面元素,而是javascript的控件,所以不能用传统的方法去操作,需要用另外的方法操作,下面介绍处理三种弹框的方法已经弹框的属性:(1)accept():用于确认,适用三种弹框(2)dismiss():用于取消,适用三种弹框(3)send_keys():仅适用于prompt方法,用于输入文本(4)text:用于获取提示的文本值二、定义form表单定义三个超链接,点击分别弹出不同弹框 <a href="javascript:alert('提示框')" id="alert">Alert</a><br><a href="javascript:confirm('确认删除吗')" id="confirm">Confirm</a><br>prompt返回内容存在变量age中,取到返回值后将变量写入页面<a href="javascript:var age=prompt('请输入年龄');document.write(age)" id="prompt">Prompt</a><br>界面如下三、表单测试1、alert测试(1)用例1:点击超链接alert结果1:弹出alert类型弹窗自动化代码:直接调用WebElement类中的click()方法 self.driver.find_element(By.ID,"alert").click()#点击超链接alert(2)用例2:弹框中点击确定结果2:弹框消失自动化代码:首先需要将Webdriver的作用域从主窗口切到弹框上,操作三种弹框:alert、confirm、prompt前,都需要执行该操作,用到的方法是self.driver.switch_to.alert,第二步就可以在弹框中操作,点击确定,用到的方法是accept() alert=self.driver.switch_to.alert#由主窗口切换到alert,返回一个alert对象sleep(2)#print(alert.text)alert.accept()#点击确定sleep(2)2、confirm测试(1)用例1:点击超链接confirm结果2:弹出confirm类型的弹框自动化代码:同样直接调用WebElement类中的click()方法 self.driver.find_element(By.ID,"confirm").click()#点击confirm超链接(2)用例2:点击确定结果2:弹框消失自动化代码:用到的方法是accept() confirm=self.driver.switch_to.alert#切换至confirm弹框sleep(2)print(confirm.text)#打印弹窗中文本confirm.accept()#点击确定sleep(2)(3)用例3:点击取消结果3:弹框消失自动化代码:用到的方法是dismiss() confirm.dismiss()#点击取消sleep(2)3、prompt测试(1)用例1:点击超链接prompt结果1:弹出prompt类型弹框自动化代码:直接调用WebElement类中的click()方法 self.driver.find_element(By.ID,"prompt").click()(2)用例2:输入内容并确认用例2:文本成功输入并写入页面自动化代码:输入文本用到的是send_keys()方法,点击确定用到的是accept() prompt=self.driver.switch_to.alert#切换到prompt弹框sleep(2)prompt.send_keys('12')sleep(2)prompt.accept()sleep(2)
  • [技术干货] Selenium测试form表单之下拉列表
    处理form表单中的下拉列表,需要用到一个Selenium工具类-Select一、Select工具类常用属性和方法方法/属性描述1select_by_value()根据值选择2select_by_index()根据索引选择3select_by_visible_text()根据文本选择4deselect_by_value根据值反选5deselect_by_index()根据索引反选6deselect_by_visible_text()根据文本反选7deselect_all()反选所有8options所有选项9all_selected_options所有选中选项10frist_selected_option第一个选择选项二、form表单测试1、下拉列表选项为单选时,定义from表单(1)form表单代码 <select name="provise" id="provise"></select>如下图所示,form表单中定义了一个单选城市的下拉列表(2)测试用例用例:选中不同选项结果:可正常选中,各个选项互斥自动执行测试用例代码:利用Select类中三个不同方法实现:select_by_value(); select_by_index(); select_by_visible_text() select.select_by_index(1)#根据索引值选中选项,index:0,1,2···sleep(2)select.select_by_value('bj')#根据值选中选项sleep(2)select.select_by_visible_text('TianJing')#根据可视化文本选中对象sleep(2)2、下拉列表选项为多选时,需多定义一个属性multiple(1)form表单代码 <select name="provise" id="provise" multiple></select>如下图所示,定义了一个可多选城市的form表单(2)测试用例1用例1:选中多个选项结果1:可正常选中,各个选项不互斥自动化执行测试用例代码:通过索引遍历选项,逐个选中,用到的Select类方法是select_by_index():通过索引选中 #多选的情况下将选项全选for i in range(3):select.select_by_index(i)sleep(1)sleep(2)也可以利用的是Select类中options属性,遍历options列表逐个点击 for option in select.options:option.click()#点击选项sleep(2)sleep(2)(3)测试用例2用例2:反选所有选项结果2:所有选项取消选中状态自动化执行用例代码:用到Select类中的deselect_all()方法 #反选全部select.deselect_all()sleep(2)三、总代码1、form表单定义<!DOCTYPE html><html lang="en" xmlns="http://www.w3.org/1999/html" xmlns="http://www.w3.org/1999/html"><head> <meta charset="UTF-8"> <title>Title</title></head><body> <form action="javascript:alert('test')" > provide: <select name="provise" id="provise" multiple> <option value="bj">BeiJing</option> <option value="sh">ShangHai</option> <option value="tj">TianJing</option> </select></form></body></html>2、form表单测试from selenium import webdriverfrom time import sleepimport osfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support.select import Select class Testcase(object):#继承object类 def __init__(self): self.driver=webdriver.Edge() path=os.path.dirname(os.path.abspath(__file__)) file_path ='file:///' + path + '/form2.html' self.driver.get(file_path)#加载form表单 def test_select(self): se=self.driver.find_element(By.ID,"provise")#定位元素 select=Select(se)#实例化Select对象,参数为WebElement对象 # select.select_by_index(1)#根据索引值选中选项,index:0,1,2··· # sleep(2) # select.select_by_value('bj')#根据值选中选项 # sleep(2) # select.select_by_visible_text('TianJing')#根据可视化文本选中对象 # sleep(2) # #多选的情况下将选项全选 # for i in range(3): # select.select_by_index(i) # sleep(1) # sleep(2) # # #反选全部 # select.deselect_all() # sleep(2) for option in select.options: option.click()#点击选项 sleep(2) sleep(2) self.driver.quit() if __name__=="__main__": case=Testcase() case.test_select()
  • [技术干货] Selenium测试form表单之checkbox和radio
    一、定义form表单用到的元素:checkbox和radiobutton下图定义了一个选择爱好和选择性别的form表单,区域1用到的表单元素是checkbox(复选框),区域2用到的表单元素是radiobutton<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>Title</title></head><body><form action="javascript:alert('test')"> swimming:<input type="checkbox" name="swimming" value="swimming"><br> reading:<input type="checkbox" name="reading" value="reading"><br><hr> gender<br> <input type="radio" name="gender" value="male" text="male"><label>male</label><br> <input type="radio" name="gender" value="female" text="female"><label>female</label><br> <input type="submit" name="login" value="login"></form></body></html>二、测试checkbox用例1:选中checkbox选项预期结果1:正常选中 swimming=self.driver.find_element(By.NAME, 'swimming')#定位元素if not swimming.is_selected():swimming.click() #选中swimmingreading=self.driver.find_element(By.NAME, 'reading')#定位元素if not reading.is_selected():reading.click() #选中readingsleep(10)用例2:反选checkbox选项结果2:不选中选项 swimming.click()sleep(2)三、测试radiobutton用例1:选中男性结果1:正常选中 ls=self.driver.find_elements(By.NAME, 'gender')#find_elements()方法返回一个WebElement对象列表ls[0].click()sleep(2)用例2:选中女性结果2:正常选中 ls=self.driver.find_elements(By.NAME, 'gender')ls[1].click()sleep(2)四、代码from selenium import webdriverfrom time import sleepimport osfrom selenium.webdriver.common.by import By class TestCase: def __init__(self): self.driver = webdriver.Edge() path = os.path.dirname(os.path.abspath(__file__)) # 获取当前路径的父目录 file_path = 'file:///' + path + '/form1.html' # 获取form表单完整路径 self.driver.get(file_path) # 加载form表单 def test_checkbox(self): swimming=self.driver.find_element(By.NAME, 'swimming') if not swimming.is_selected(): swimming.click()# 选中swimming reading=self.driver.find_element(By.NAME, 'reading') if not reading.is_selected(): reading.click() # 选中reading sleep(2) swimming.click() sleep(2) self.driver.quit() def test_radio(self): ls=self.driver.find_elements(By.NAME, 'gender') #ls[0].click() ls[1].click() sleep(2) self.driver.quit() if __name__=="__main__": case = TestCase() #case.test_checkbox() case.test_radio()
  • [技术干货] Selenium操作:测试form表单
    from表单是经常测试的用例,用户登录、注册等都会用到form表单,本文简单设计了一个用户登录的form表单,并对该form表单进行测试一、自定义form表单1、用到的组件如下图,图中定义了一个登录界面的form表单,用到的表单元素:type="text"; type="submit"2、代码示例新建HTML文件文件中输入代码<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>Title</title></head><body><form action="javascript:alert('hello')"> Username:<input type="text" name="username" id="username"><br> Password:<input type="text" name="pwd" id="pwd"><br> Submit:<input type="submit" value="submit" id="submit"></form></body></html>二、form表单测试1、定位表单元素(1)获取form表单路径(a)当前文件所在路径 path = os.path.abspath(__file__)#获取当前完整路径,即绝对路径#print(file_path)输出:C:...\desktop\demo.py(b)当前路径的父目录 path = os.path.dirname(os.path.abspath(__file__))#获取当前路径的父目录print(path)输出:C:...\desktop(c)form表单完整路径 file_path = 'file:///'+path + '/form.html'#获取form表单完整路径print(file_path)输出:C:...\desktop\form.html(2)加载form表单 self.driver.get(file_path)2、输入测试值测试值1:输入账号和密码并提交 username=self.driver.find_element(By.ID,"username")#定位元素username.send_keys("admin")#账号:adminpwd=self.driver.find_element(By.ID,"pwd")#定位元素pwd.send_keys('123')#密码:123sleep(2)self.driver.find_element(By.ID,"submit").click()#提交结果1:弹出提示框,提示“Hello”测试值2:获取输入的账号密码 self.driver.switch_to.alert.accept()#关闭提示print(username.get_attribute('value'))#获取输入的账号print(pwd.get_attribute('value'))#获取输入的密码结果2:控制台输出账号密码测试值3:清空账号密码 username.clear()pwd.clear()结果3:输入框中账号密码被清空from time import sleepfrom selenium import webdriverimport osfrom selenium.webdriver.common.by import By class Testcase: def __init__(self): self.driver=webdriver.Edge() #path = os.path.abspath(__file__)#获取当前完整路径,即绝对路径 path = os.path.dirname(os.path.abspath(__file__)) #获取当前路径的父目录 file_path = 'file:///'+path + '/form.html'#获取form表单完整路径 self.driver.get(file_path)#加载form表单 #print(file_path) def test_login(self): #用例1 username=self.driver.find_element(By.ID,"username")#定位元素 username.send_keys("admin")#账号:admin pwd=self.driver.find_element(By.ID,"pwd")#定位元素 pwd.send_keys('123')#密码:123 sleep(2) self.driver.find_element(By.ID,"submit").click()#提交 #用例2 self.driver.switch_to.alert.accept()#关闭提示 print(username.get_attribute('value'))#获取输入的账号 print(pwd.get_attribute('value'))#获取输入的密码 #用例3 username.clear() pwd.clear() sleep(2) self.driver.quit() if __name__=="__main__": case=Testcase() case.test_login()
  • [技术干货] WebDriver常用属性和方法
    除了上一篇的元素定位方法,Selenium中的WebDriver类中还有一些常用的属性和方法一、常用的属性1、下表列出了WebDriver的常用属性#属性属性描述用途1driver.name浏览器名称2driver.url当前url3driver.title当前页面标题可用于判断是否成功打开目标页面4driver.page_source当前页面源码5driver.current_window_handle窗口句柄6driver.window_handles当前窗口所有句柄2、代码示例下面代码能够输出webdriver类中属性的值` from selenium import webdriverfrom selenium.webdriver.common.by import Byfrom time import sleep class Testcase: def __init__(self): self.driver = webdriver.Edge() self.driver.get("https://www.baidu.com") #输出WebDriver类常用的属性 def test_prop(self): print(self.driver.name) print(self.driver.current_url) print(self.driver.title) print(self.driver.current_window_handle) #print(self.driver.page_source) if __name__ == '__main__': testcase=Testcase() testcase.test_prop()输出结果如下:二、常用的方法1、下表列出了WebDriver类常用方法#方法用途1driver.find_element()定位元素2driver.switch_to.window()切换窗口,目标页面句柄作为参数3driver.back()后退至上一页面4driver.forward()前进至下一页面5driver.refresh()刷新当前页面6driver.close()关闭当前窗口7driver.quit()关闭所有窗口2、代码示例以下代码调用WebDriver中常用方法from selenium import webdriverfrom selenium.webdriver.common.by import Byfrom time import sleep class Testcase: def __init__(self): self.driver = webdriver.Edge() self.driver.get("https://www.baidu.com") def test_method(self): #输入框中输入关键词“Python”并点击搜索 self.driver.find_element(By.ID, "kw").send_keys("Python") self.driver.find_element(By.ID,"su").click() sleep(2) #点击链接,打开另一个窗口 self.driver.find_element(By.LINK_TEXT,"百度百科").click() sleep(2) #切换回第一个窗口 self.driver.switch_to.window(self.driver.window_handles[0]) sleep(2) #后退到上一页面 self.driver.back() sleep(2) #前进到下一页面 self.driver.forward() sleep(2) #刷新当前页面 self.driver.refresh() sleep(2) #关闭当前窗口 self.driver.close() sleep(2) #关闭整个页面,所有窗口 self.driver.quit() if __name__ == '__main__': testcase=Testcase() testcase.test_method()
  • [技术干货] Selenium实现元素定位
    Selenium提供了定位元素的方法find_element(),该方法被定义在WebDriver类中。一、参数1、两个参数,参数1根据不同定位方法确定,定位方法如下:(1)通过id定位:使用参数By.ID定位元素的ID属性;(2)通过元素名定位:使用参数By.NAME定位元素的NAME属性;(3)通过标签名定位:使用参数BY.TAG_NAME定位元素的TAG_NAME属性;一般不使用该参数,使用该参数后方法会返回list,不能准确定位所找元素(4)通过xpath定位:使用参数By.XPATH通过xpath表达式定位元素;(5)通过css class定位:使用参数By.CLASS_NAME定位元素的class属性;(6)通过css选择器定位:使用参数By.CSS_SELECTOR通过CSS选择器定位元素;(7)通过链接文本定位:使用参数By.LINK_TEXT定位元素(8)通过部分链接文本定位:使用参数By.PARTIAL_LINK_TEXT定位元素2、参数2为上述对应属性的值如何确定参数2:打开网页,选择任意元素,比如输入框,按钮,右键单击检查,就会有对应属性出现。以百度为例:By.ID="kw"By.NAME="wd"By.TAG_NAME="input"By.CLASS_NAME="s_ipt"By.XPATH和By.CSS_SELECTOR可右键单击该元素,直接复制By.LINK_TEXT和By.PARTIAL_LINK_TEXT为页面上任意链接文本,比如百度页面上的"新闻","首页"等,均可作为其值,两者区别在于,前者为链接的全部文本,后者为链接的部分文本二、返回值返回一个WebElement对象,这个对象代表页面上的一个元素三、简单的代码示例以下是一个简单的示例代码,展示如何使用find_element()方法通过各个属性定位元素from time import sleepfrom selenium import webdriverfrom selenium.webdriver.common.by import By #将各个元素定位方法封装成一个类class TestCase: #初始化方法 def __init__(self): #驱动程序打开浏览器 self.driver=webdriver.Edge() #跳转对应网页 self.driver.get("http://www.baidu.com") #网页最大化 self.driver.maximize_window() #通过id定位元素 def test_id(self): #网页中定位到输入框,输入关键词python self.driver.find_element(By.ID,"kw").send_keys("python") #定位到按钮并点击搜索 self.driver.find_element(By.ID,"su").click() sleep(2) quit() #通过name定位元素 def test_name(self): self.driver.find_element(By.NAME,"wd").send_keys("selenium") self.driver.find_element(By.ID,"su").click() sleep(2) quit() #通过xpath定位元素 def test_xpath(self): self.driver.find_element(By.XPATH,"//*[@id='kw']").send_keys("selenium") self.driver.find_element(By.XPATH,"//*[@id='su']").click() sleep(2) quit() #通过CSS_SELECTOR定位 def test_css_selector(self): self.driver.find_element(By.CSS_SELECTOR,"#kw").send_keys("selenium") self.driver.find_element(By.CSS_SELECTOR,"#su").click() sleep(2) quit() #通过CSS_NAME定位元素 def test_class_name(self): self.driver.find_element(By.CLASS_NAME,"s_ipt").send_keys("selenium") self.driver.find_element(By.ID,"su").click() sleep(2) quit() #通过LINK_TEXT定位元素 def test_link_text(self): #网页中找到"贴吧"文本的链接并点击 self.driver.find_element(By.LINK_TEXT,"贴吧").click() sleep(2) quit() #通过PARTIAL_LINK_TEXT定位元素 def test_partial_link_text(self): #网页中找到含有"AI"文本的链接并点击 self.driver.find_element(By.PARTIAL_LINK_TEXT,"AI").click() sleep(2) quit() if __name__ == "__main__": testcase = TestCase() #testcase.test_id() #testcase.test_name() #testcase.test_xpath() #testcase.test_css_selector() #testcase.test_class_name() #testcase.test_link_text() testcase.test_partial_link_text()
  • [技术干货] 【DTSE Tech Talk 精选问答】NO.67丨测试效率&质量提升,赋能产品研发的测试自动化工厂
    如何构建企业测试中台,实现一站式云端全流程测试自动化解决方案?本期直播将聚焦华为云PaaS 测试计划(CodeArts TestPlan)服务,它是面向软件开发者提供的一站式云端测试平台,覆盖测试管理、接口测试,融入DevOps敏捷测试理念,帮助您高效管理测试活动,保障产品高质量交付。直播链接:cid:link_0Q:自动化测试在不同数据源下怎么做数据整合?A:如果不同数据源只的是针对不同的测试数据。TestPlan的接口自动化测试,提供了全局变量功能,在全局变量中支持配置不同的环境变量。Q:如何在不牺牲性能的前提下,支持更多的用户和测试用例?A:要支持更多的用户和测试用例,实际就是要提高并发。这就要求客户端能提供更大的并发数量,以及服务端提供更高的处理性能(吞吐量,请求处理时延等),同时,用例脚本本身的测试内容也要在合理的范围内。 如果用例或系统已经没有优化的空间,提高并发,必然也需要更大的性能开销。Q:做过的测试用例可以形成模板吗?用例间依赖关系如何管理?A:暂不支持将已有用例固化为模板。但,在测试用例页面的右上角,有一个测试资产中心,内置了大量优秀的测试用例作为范本。 用例间要尽量减少耦合,如果有前后置需求,如接口自动化,可以在创建测试套时,使用前置用例,或后置用例进行管理,用例之间可以使用动态全局变量进行数据传递。Q:服务支持哪些协议和标准(如REST, SOAP, GraphQL等)进行接口测试,是否有扩展性?A:CodeArts TestPlan支持Restful接口,同时系统关键字也提供了系统关键字,进行中间件(redis、obs、kafka),数据库(MongoDB、Mysql)的关键字,而且处于持续更新中,更多关键字可以联系技术支持。Q:测试用例批量导入和导出支持哪些格式?A:手工和功能自动化测试用例支持excel导入导出,接口自动化支持postman、swagger、exce方式导入,和excel的导出。Q:自动化测试可以自定义系统资源的动态分配吗?A:自动化测试,可以根据需要选择自定义资源池,控制资源的使用。Q:测试用例如何进行版本回溯?最多可以保留多少个版本?A:版本回溯属于业务流程管控,平台当前没有内置该流程。专业版\企业版最多可以保留50个版本(包括基线版本)。Q:测试中台如何实现灾难恢复和保证业务连续性?在发生系统故障时,如何快速恢复测试活动?A:公有云和私有云都是多AZ部署,平台经过系统的可靠性、韧性测试。Q:CodeArts TestPlan是否支持基于风险的测试策略?A:测试设计中内置了华为公司多年沉淀的测试策略和设计模板,可以作为参考,输出自有产品的测试策略。Q:对于测试覆盖率,平台有功能生成全覆盖的脚本吗A:基于风险的测试策略下,测试是无法穷尽的。但是在确定的场景下,可以使用测试设计,基于因子组合选择全组合的方式生成用例。Q:如果不同的语言环境,能配合k8s+docker进行自动化测试吗?比如有java,有c++,有pythonA:支持,使用功能自动化,可以支持接入自定义执行机,支持任意脚本语言。Q:如何确保自动化测试脚本的稳定性和可维护性?A:可以通过三层用例管理,以版本的方式管理用例和对应的脚本。Q:CodeArts TestPlan支持移动端应用测试吗?目前适配哪些类型终端?A:CodeArts TestPlan的功能自动化能力,没有内置具体的移动端测试框架,可以支持接入自定义执行机(和测试框架),提供对应的移动端功能测试。Q:华为云PaaS测试计划(CodeArts TestPlan)的测试计划包含哪些内容?A:包含迭代、版本、周期、需求范围等内容。Q:做跨平台测试,不同操作系统和浏览器间可以支持吗?A:支持,可以使用功能自动化测试,支持接入自定义执行机(和测试框架),不限制具体的操作系统和浏览器。Q:自动化测试的脚本,可以和现有的融合吗?比如pytest的或者其他的A:支持,可以使用功能自动化测试,支持接入自定义执行机(和测试框架),不限制具体脚本语言。Q:如何确保不同团队(开发、测试、运维)在使用测试中台时的高效协作?A:测试计划(CodeArts TestPlan)是面向软件开发者提供的一站式云端测试平台,覆盖测试管理、接口测试,融入DevOps敏捷测试理念,帮助您高效管理测试活动,保障产品高质量交付。Q:测试用例可以做优先级排序吗?应该遵循什么原则排序?A:用例有不同的等级,分别用P0、P1…表示。0级:最基本的功能验证,用例不宜过多,各模块尽量保证在10-20个,占比5%左右1级:基本功能验证,可用于继承特性的基本功能验证、迭代验收前的基本功能验证等,占比20%左右2级:重要特性验证,可用于测试版本(非回归版本)中手工测试,占比60%左右3级:一般功能/非重要功能验证,包括对基本/重要功能的异常测试,占比10%~15%左右4级:非常特殊输入、场景、阈值条件的用例,该级别用例不宜过多,占比0%~5%左右Q:CodeArts TestPlan支持自定义测试模板吗?A:暂不支持将已有用例固化为模板。在测试用例页面的右上角,有一个测试资产中心,内置了大量优秀的测试用例作为范本。Q:华为云PaaS测试计划(CodeArts TestPlan)的测试设计有哪些方式?A:支持按特性或需求创建,也可以使用空白脑图,或基于模板创建。Q:在DevOps环境下,如何实现测试活动的自动化和持续集成?A:可以通过在流水线中配置测试验证的插件来实现。部署完成,就可以执行一遍对应的自动化测试。Q:在性能测试方面,该平台提供哪些实时监控和分析工具,以帮助开发者快速识别和解决性能瓶颈?A:支持AOM和APM,可以帮助分析cpu、内存等指标,以及调用链指标,配合压测指标曲线快速识别问题。Q:华为云PaaS测试计划(CodeArts TestPlan)产品都有哪些特性?A:测试计划(CodeArts TestPlan)是一款自主研发的一站式测试管理平台,沉淀了华为多年高质量的软件测试工程方法与实践,覆盖测试计划、测试设计、测试用例、测试执行和测试评估等全流程,旨在帮助企业协同、高效、可信的开展测试活动,保障产品高质量上市。Q:测试数据怎么做隔离和清理?A:可以通过全局变量中的环境进行隔离,同时,可以在测试的后置步骤中进行清理操作。Q:华为云PaaS测试计划(CodeArts TestPlan)产品使用流程包括哪些?A:通用的流程包括测试计划、测试设计、测试用例、测试执行和测试评估。Q:在编写接口测试自动化脚本过程中,前后步骤如何传递变量?A:可以使用局部变量,或动态全局变量。Q:CodeArts TestPlan在软件交付方面有哪些优势?A:大规模高效协同测试、启发式测试设计、测试验证双向可追溯、自动化测试、可视化设计与度量等。Q:支持压力测试和负载测试?A:可以使用CodeArts PerfTest进行压测和负载测试,服务提供了丰富的压测模型,灵活的用例脚本,可以满足多种压测场景的使用。Q:该服务支持哪些编程语言?A:支持,可以使用功能自动化测试,支持接入自定义执行机(和测试框架),不限制具体脚本语言。Q:使用CodeArts TestPlan时,如何处理接口自动化脚本文件过大问题?A:首先,需要建立好用例规范,每个用例建议不要包含过多的用例步骤;其次,常用的脚本可以封装为关键字、组合关键字。Q:华为云PaaS 测试计划(CodeArts TestPlan)服务适用于哪些应用场景?A:如:软件测试和质量管理场景、持续自动化测试场景等。想要了解更多华为云PaaS 测试计划(CodeArts TestPlan)服务相关知识,欢迎观看DTSE Tech Talk 系列技术直播
  • [行业前沿] 【分享交流】有哪些好用的自动化测试工具
    有哪些好用的自动化测试工具
  • [技术交流] 单元测试/集成测试自动化工具
    单元测试/集成测试自动化工具--WinAMSCoverageMaster winAMS : 适用于嵌入式目标机代码的单元测试/集成测试工具全面支持嵌入式微机!验证嵌入式C/C++软件 实施以模块为单位的自动化单元测试工具不需要HookCode 直接使用目标机代码进行单元测试联合静态解析工具[CasePlayer2],提供C0(语句),C1(判定),MC/DC覆盖率报告,优化测试用例制作已取得第三方认证机构TUVSUD对适用于汽车机能安全ISO26262软件工具的认证产品概要[Coverage master winAMS]是以嵌入式软件的函数为单位,实施模块单元测试以及C0/C1/MCDC覆盖率测试(coverage test)的嵌入式软件自动化单元测试工具。目标机源代码通过交叉编译器生成目标机执行代码,通过跟实际处理器同样的模拟处理器环境进行单元测试,不需要对执行代码做任何变动,使高信赖性的模块测试成为可能。在汽车控制软件这样的对安全性要求极高的领域,单元测试已经成为不可缺少的一部分。使用目标机代码进行单元测试也是为了符合汽车行业中ISO26262功能安全认证标准。产品特长全面支持嵌入式微机!验证嵌入式C/C++软件 实施以模块为单位的自动化单元测试工具作为能够检验出仅凭系统测试以及整体测试无法发现的[潜在错误]的检测方法,[单元测试]在嵌入式开发领域受到广泛重视。同时,单元测试也是汽车用软件功能安全(ISO26262)领域中要求实施的认证项目之一。[Coverage master winAMS]直接使用通过交叉编译生成的目标机代码,在模拟处理器环境下进行单元测试。既能实现C语言程序的逻辑上的单元验证,又能够对嵌入式微机组装为产品后可能发生的问题等进行具有高信赖度的白盒(white box)测试。不需要HookCode 使直接使用目标机代码进行单元测试成为可能的业界唯一的工具有些公司的单元测试工具往往采用在被测试对象的源代码中追加测试用代码或者测试用驱动器的方法,导致测试时所用的代码与组装为产品后的目标机用代码不同。虽然[理论上运行功能应该是相同的],但是从嵌入式开发的角度考虑,这样就如同对交叉编译所生成的经过优化处理的代码进行了加工,无法确保最终产品的质量。Coverage master winAMS是业界唯一的,具有[不需要对被测试对象做任何加工]实施单元测试功能的工具,特别是在安全性要求高的领域中得到很高的评价。不需建立单元测试专用的环境,可以在开发用交叉编译环境进行单元测试Coverage master winAMS不需要追加任何测试用驱动器或测试用代码,可以直接使用将组装成产品的目标代码进行单元测试。单元测试能够与软件开发使用共同的交叉编译环境,不再需要对测试资源进行专门管理,也不再需要建立其他专用环境。因此,既方便程序资源管理,又能够缩短准备测试环境所需的时间。符合汽车功能安全标准(ISO26262)[不做加工直接使用目标机代码实施单元测试]这一要求的最佳工具ISO26262是从IEC61508衍生出来的适用于汽车制造领域的功能安全标准。其中的Part.6-9[软件程序单元测试]包括了关于软件程序的构造覆盖率测试以及有关的规定项目。根据汽车安全标准(ASIL),提出了测试语句覆盖率(statement coverage),分支覆盖率(branch coverage),MC/DC覆盖率的推荐性事项。其中的另一个推荐性事项是[尽可能使单元测试的环境与目标环境相同]的规定。如果在与目标环境不同的环境下进行单元测试,必须表明源代码与目标代码的差别,以及目标环境和测试环境的差别。因此,对于那些使用与目标微机不同的电脑进行编译和单元测试的其他公司的工具而言,这个要求很难满足。 还有些公司的单元测试工具虽然包括交叉编译环境及编译功能,而且也能够在与目标环境相同的环境下进行测试,但是所有的测试都需要插入测试用代码,进行再次编译,因此测试也只能在与目标环境不同的环境下实施。GAIO提供的单元测试工具Coverage master winAMS具有●采用全面支持嵌入式微机的微机化功能测试平台环境●不需要插入测试用代码直接使用目标机代码进行测试的特征,提供符合ISO26262标准要求的必须功能。GAIO提供的Coverage master winAMS是符合ISO26262标准[直接使用整装用代码实施单元测试]这一要求的业界唯一的工具。关于汽车机能安全ISO26262的对应以及认证的获得已取得第三方认证机构TUVSUD对适用于汽车机能安全ISO26262软件工具的认证2012年6月28日,「Coverage master winAMS / General」测试工具获得由德国TUVSUD第三方认证机构,在汽车机能安全规格的ISO26262软件工具方面的认证,包括日本在内亚洲地区首次获得该项认证。通过此项认证,说明本公司的单元测试工具「Coverage master winAMS / General」,以及程序分析工具「CasePlayer2」,在静态分析和单元测试领域,是符合所有安全度水准的工具,并由TUVSUD认证机构得到了保障。ISO 26262对于不同的开发用软件工具在工具置信水平(TCL),都需要开发者提供开发软件工具的认证书。此项认证适用于在工具认证当中,最为复杂的TCL3工具认证标准。因此,导入本公司的单元测试工具之后,不需要对TCL的部分进行认证,进而可以缩减手续跟时间。主要的单元测试功能采用SSTManager管理单元测试projectSSTManager是Coverage master winAMS的应用功能,用于管理单元测试project,制作测试数据(test data)。从设定测试环境开始,到报告测试结果为止,均由微机化功能测试平台(ISS)实施综合管理。采用通用便利的CSV文件管理测试数据的输入输出Coverage master winAMS不需要插入测试用代码,直接使用目标机代码进行单元测试。采用通用便利的CSV文件管理函数测试时使用的输入输出数据。测试结束后,输出的测试结果和输出的期待值也将以相同的格式显示在CSV文件之中。C0/C1覆盖率报告的自动化制作功能(标准功能)根据测试的输入输出数据自动报告相应源代码的C0/C1测试覆盖率结果。包括通过图形(viewer)显示测试数据,以及与其相应的被测试的源代码路径的功能,用于分析测试结果。作为选项功能也包括MC/DC覆盖率测试功能。MC/DC覆盖率的自动化测试功能(选项功能)作为选项功能提供MC/DC覆盖率测试功能。C0/C1覆盖率测试不需要加工即可直接使用目标机代码。然而,MC/DC覆盖率测试对于复合式的条件式,需要自动插入HookCode将复合式的条件式分解,才能对各条件式进行测试。这样就有可能导致测试用代码与目标机用代码的不同。为了验证HookCode的妥当性,在MC/DC覆盖率测试的同时,运行目标机代码,确认运行结果与期待值的一致性。注:右图举例显示,第2个if句的复合条件式中,[gbc>30]为false时的分支没有被测试到。以C1覆盖率测试来说,它的测试结果是OK;而对于MC/DC覆盖率测试来说,它的结果是NG。注: MC/DC覆盖率测试功能不支持C++程序。单元测试的效率化功能联合程序解析工具CasePlayer2,实现代码参照解析作业的效率化利用CasePlayer2生成的流程图表以及模块构造图(调用函数的构造图)与源代码的连接(link)功能,使单元测试用源代码的解析工作效率化。能够自动检索被测试函数的外部变量,使测试条件设定效率化联合程序解析工具CasePlayer2,自动检索被测试函数所使用的外部变量。缩短了以往必须对源代码进行搜索找出输入条件的变量所需的工作。而且,能够防止人工操作导致的类似变量指定遗漏的的错误。根据代码解析自动化制作C0,C1,MC/DC 覆盖率测试计划联合程序解析工具CasePlayer2,自动化制作符合覆盖率测试要求的条件分支if,switch,for,while等的测试数据。可以将被测试函数中含有的条件式(if以及switch等)在数据制成图形(Viewer)上列表显示。点击其中的条件,工具将自动开始检索与之相关的变量,进而从所设置的条件的境界值中自动生成覆盖率测试所需要的数据。为了达到C1/MCDC覆盖率,测试时需要对各函数的数据进行组合。利用CasePlayer2提供的解析结果,分析条件式的net构造,在重复性限制在最小限度下生成C1/MCDC覆盖率测试用数据。支持MPU CoverageMaster winAMS Supported Processor List(English)动作环境・操作PC/OS・IBM PC/AT 兼容机・Pentium(相当) 2GHz 以上的CPU・存储器 512MB 以上(推荐值)・显示器分辨率 XGA(1024*768)以上(推荐值)・Windows XP, Windows Vista, Windows 7(32bit/64bit)(※Windows 95/98/Me/NT/2000 未支持)
  • [技术干货] 自动化测试工具推荐
    前言我们都希望为我们的 Web 应用程序构建易维护的测试。作为这个目标的一部分,我们都希望能集中精力在测试本身,而尽量避免困在实施的具体细节中。从长远来看,测试应该是可维护的,对软件定期的变更并不会破坏测试本身或者让团队的开发节奏变慢。某些测试工具可以在做出更改和查看结果之间提供简短的反馈循环,但不能精确地模仿浏览器的行为。其他工具可能会使用实际的浏览器环境,但会降低迭代速度,并且在连续集成系统中可能会变得更加脆弱。1. Selenium知名的浏览器 web 应用测试框架,可以用 Java、C#、Ruby、JavaScript、R 和 Python 等多种编程语言编写测试案例。Selenium为每种语言提供客户端 API。Selenium WebDriver 尽可能使用原生操作系统级别的功能,而非基于浏览器 JavaScript 的命令来驱动浏览器。这样就绕过了原生功能和 JavaScript 命令之间由于细微差别而产生的问题(包括安全限制)。它提供了很大的灵活性,甚至还支持 iframe 和多个浏览器标签。卓越的跨浏览器功能令人印象深刻。可以在主流浏览器(Chrome、Firefox、Safari、Edge、Internet Explorer)上执行 Selenium 测试。Selenium Grid 可以与 WebDriver 一起使用,以在远程系统上执行测试。使用 Selenium 的唯一缺点是,它需要大量的技能,并且编写测试非常耗时。对没有编程经验的人来说,乍一看用 Selenium 编写测试似乎很容易;但是如果没有最佳实践,将导致项目内的测试自动化框架难以维护且不够稳定可靠。2. EndtestEndtest是智能自动化测试解决方案,它使用多个开源和闭源组件去简化创建和执行测试的流程。其中之一就是 Recorder 组件可以让用户不用编程技巧就能创建和执行测试。你可以用图形化界面编辑管理自己的测试案例,而不用编写任何代码。它和 Selenium 一样拥有灵活性,允许你自动化测试场景,其中包含 iframe、多个浏览器标签、文件上传、ShadowDOM, 等等。它同 Selenium 一样拥有跨浏览器的特性, 支持所有主流的浏览器(Chrome、Firefox、Safari、Edge、Internet Explorer)。同时,它也包括跨浏览器的云框架,支持 Windows、Mac 以及移动设备上的浏览器。此外,它还有支持 JavaScripts 执行的组件,以及发送 API 请求和连接数据库执行 SQL 语句的组件。这些组件可用于在测试中添加额外的验证步骤,并可准备或清理测试环境。3. WatirWatir是一个 Ruby 的浏览器自动化测试开源库。Watir 与对浏览器的互动方式和人类是一样的:如点击一个网页元素,填输入字符。它的底层使用了 Selenium 并且提供同样的灵活性,也支持跨浏览器。同时,它也支持 iframes 以及多个浏览器标签。Watir 最大的优点是 API 很容易使用,它在繁复的 Selenium API 之上增加了一层简单性。不过,它的主要缺点是,它不如 Selenium 受欢迎,在寻找答案和解决方案方面你会遇到一些困难。4. Puppeteer一个 Node 库,它提供了高级的 API 并通过 DevTools 协议来控制 Chrome(或 Chromium)。我认为未来它可以代替 Selenium。它也具有支持 iframe 和多个浏览器标签的灵活性。值得一提的是,它有 2 种不同的软件包:puppeteer-core 和 puppeteer唯一的区别是 puppeteer-core 在安装后不会自动下载 Chromium。puppeteer的主要缺点是缺乏跨浏览器功能,因为它仅适用于基于 Chromium 的浏览器。即使 Opera 和 Edge 迁移到 Chromium,也无法保证 Firefox 和 Safari 将来也会这样做。另一个缺点是,唯一受支持的语言是 Node.js。即使到 2020 年一切似乎都围绕 JS 展开,但是仍然有一些用户可能想使用其他语言进行自动化测试的开发。5. Playwright一个 Node 库,可通过单个 API 在 Chromium、Firefox 和 WebKit 浏览器上执行自动化测试。Playwright旨在不断增长的 Web 浏览器集上实现自动化操作。Playwright 类似于 Puppeteer。它支持多页面、多域名和 iframes 测试,还可以模拟移动端设备,地理指向和权限控制也是可以测试的。即使它具有更广泛的跨浏览器支持,但它也不支持 Internet Explorer。因为它是一个相对较新的库,所以你可能现在在线上找不到很多资源。如果你在编写 Node.js 代码方面有扎实的经验,那么 Playwright 可以一试。6. Sikuli在运行 Windows、Mac 或 Linux 的台式计算机屏幕上看到的任何内容,都可以使用 Sikuli 执行自动化测试。它使用由 OpenCV 支持的图像识别来识别视觉组件。如果无法轻松访问 GUI 内部或要操作的应用程序或网页的源代码,这个工具会非常方便。实际上,这是大多数现代 RPA 解决方案背后的技术。Sikuli的优点是,元素具有唯一属性或属性是否更改都无关紧要,因为 Sikuli 仅依赖于视觉识别。它的主要缺点是视觉容忍度让用户很难在不同的浏览器和屏幕尺寸之间实现自动化。并且,使用 Sikuli 库需要编程技巧,并且你可以在 Python、Ruby 和 Java 之间选择。如果你有涉及 Web 应用程序和桌面应用程序的混合自动化测试,则较好的做法是将 Selenium 用于 Web 组件,将 Sikuli 用于桌面组件。7. Micro Focus UFT (QTP)专有解决方案,以前称为 QuickTest Professional(QTP)。它提供了使 Web 应用程序和桌面应用程序自动化的功能。它使用 Visual Basic 脚本语言来定位应用程序中的元素并与之交互。同时,它还提供了一个 IDE,你只需在 GUI 中创建一个流程即可在不编写任何代码的情况下构建测试。该工具已经存在很长时间,并且确实使 Selenium 失去了很多市场份额。8. IBM Rational Functional Tester一个提供功能、回归、GUI 和数据驱动测试的自动化测试的专业工具。它确实包括有限的跨浏览器功能,因为它仅适用于 Chrome、Firefox 和 Internet Explorer。主要优点是它还可用于自动化桌面应用程序。优势之一是它具有 Eclipse Java Developer Toolkit 编辑器,这让你的团队可以轻松地使用 Eclipse 在 Java 中编写测试脚本。自带的 IDE 工具箱编辑器包含以下功能,如代码自动完成和高级调试选项。将IBM Rational Functional Tester与 CI/CD 系统集成可能会很困难,因为它被设计用在你自己的工作站上9. JestJest是一个 JavaScript 框架,允许你通过 jsdom 访问 DOM。值得一提的是,jsdom 只是浏览器工作方式的一个近似值,用于 React 应用程序的测试框架,但不是跨浏览器测试的可靠选择。Jest 确实提供了良好的迭代速度,并且具有强大的功能,例如模拟模块和计时器。理想情况下,开发人员应使用它来测试某些组件,但结果不能保证该应用程序在实际的浏览器中可以正常工作。10. CucumberCucumber是一个开源的行为驱动测试工具,支持多种编程语言,包括 Ruby,Java,Scala 和 Groovy。创建测试案例需要编程技术。实际功能可以通过使用 Gherkin 来调用。使用 Cucumber 的明显优势是,非技术用户可以轻松理解这些方案。可以说 Cucumber 并不是 Selenium 的替代品,而仅仅是对 Selenium 进行了一层包装。Selenium 和 Cucumber 的组合可提高代码的可读性,并使其更易于重用组件。
  • [问题求助] 桌面应用打不开
    使用鼠标双击打开桌面应用程序,显示执行成功但是应用没有打开。换了点击图片也显示屏幕不匹配,请问怎么可以实现打开桌面应用呢
  • [技术干货] 五大自动化测试的Python框架【转】
    自2018年被评选为编程语言以来,Python在各大排行榜上一直都是名列前茅。目前,它在Tiobe指数中排名第三个,仅次于Java和C。随着该编程语言的广泛使用,基于Python的自动化测试框架也应运而生,且不断发展与丰富。因此,开发与测试人员在为手头的项目选择测试框架时,需要考虑许多方面的因素,其中包括:框架的脚本质量,测试用例的简单性,以及运行模块可能存在的技术弱点。为了避免出现“选择困难症”,我在此为大家准备了五种Python类型的自动化测试框架,以供比较和讨论。1.Robot Framework作为最重要的Python测试框架之一,Robot Framework主要被用在测试驱动(test-driven)类型的开发与验收中。虽然是由Python开发而来,但是它也可以在基于.Net的IronPython和基于Java的Jython上运行。同时,作为一个Python框架,Robot还能够兼容诸如Windows、MacOS、以及Linux等平台。使用先决条件在使用Robot Framework(RF)之前,您需要先安装Python 2.7.14及以上的版本。我推荐您使用Python 3.6.4,以确保适当的注释能够被添加到代码段中,并能够跟踪程序的更改。同时,您还需要安装Python包管理器--pip。当然,您也必须下载相应的开发框架,例如:在开发者圈子里比较流行的PyCharm社区版。另外,由于其代码段本身并不依赖于任何IDE,因此您完全可以沿用手头既有的IDE工具。优点通过使用关键字驱动测试(keyword-driven-test)的方法,它能够帮助测试人员轻松地创建具有可读性的测试用例,进而简化了整个自动化的过程。用户能够轻松地测试数据中的语法。因为是由各种通用工具和测试库所组成,所以它不但拥有庞大的生态系统,而且可以在单独的项目中使用其各个元素。由于拥有许多类型的API,因此该框架具有高度的可扩展性。虽然并非内置功能,但是Robot可以通过Selenium Grid(请参见https://www.lambdatest.com/blog/lambdatest-now-live-with-an-online-selenium-grid-for-automated-cross-browser-testing/),来帮助用户运行各种并行测试。缺点虽然有着上述各种便利,但是Robot Framework在创建自定义的HTML报告方面比较繁琐。您顶多能用它来生成xUnit格式的简短报告。另外,Robot Framework在并行测试方面也并不见长。Robot的特点与竞品比较由于Robot具有丰富的内置库,并能使用更为简单的面向测试的DSL(Domain Specific Language),因此如果您是自动化测试领域的新手,并且缺乏开发经验的话,那么将它作为Python测试框架要比下面将要提到的Pytest或Pyunit,更容易上手一些。当然,如果您需要开发复杂的自动化框架,那么还请使用Pytest、或其他类型的Python框架。2.Pytest适用于多种软件测试的Pytest,是另一个Python类型的自动化测试框架。凭借着其开源和易学的特点,该工具经常被QA(质量分析)团队、开发团队、个人团队、以及各种开源项目所使用。鉴于Pytest具有“断言重写(assert rewriting)”之类的实用功能,许多大型互联网应用,如Dropbox和Mozilla,都已经从下面将要提到的unittest(Pyunit)切换到了Pytest之上。使用先决条件除了基本的Python知识,用户并不需要更多的技术储备。另外,用户只需要有一台带有命令行界面的测试设备,并且安装好了Python包管理器、以及可用于开发的IDE工具。优点过去,开发人员必须将他们的测试包含在各种大型的类中。如今,Pytest可以让用户写出更为紧凑的测试套件。其他的测试工具会要求开发或测试人员使用调试器,或以日志检查的方式检测某个特定值的来源。而用户在用Pytest来编写测试用例时,完全可以将所有的值都存储在测试用例之中,直到再获悉有哪些值失败了、以及哪些值得到了断言。由于涉及到的样板代码(boilerplate code)并不多,因此用户能够容易地编写和理解各种测试。测试夹具(Fixture)函数常被用来向测试函数添加某个参数,并返回不同的值。在Pytest中,您可以通过使用一个夹具来模块化另外一个。同时,用户可以使用多个夹具,在无需重写测试用例的情况下,将测试覆盖到所有参数的组合。Pytest开发人员通过发布各种实用插件,来保持框架的可扩展性。例如:pytest-xdist可以在不使用其他测试器的情况下,被用于执行并行测试。同时,单元测试也可以在无需复制任何代码的情况下,实现参数化。通过为开发人员提供各种特殊的例程,它能够使得测试用例的编写更为简单、更不易出错,同时代码也会变得更短、更易被理解。缺点上述提及的特殊例程,也意味着用户必须放弃一定的兼容性。虽然方便了用户编写测试用例,但是这些用例却无法与任何其他的测试框架一起被使用。Pytest的特点与竞品比较就编写功能性测试用例和开发复杂的框架而言,Pytest胜过下面将要提到的UnitTest。不过,它和Robot Framework类似,仅适用于开发出简单的测试框架。如果您正在考虑使用Pytest,请进一步参考《使用Pytest和Selenium WebDriver实现测试自动化》。3.UnitTest/PyUnit受到了JUnit启发的UnitTest/PyUnit,也是一种标准化的针对单元测试的Python类自动化测试框架。它的基类TestCase提供了各种断言方法、以及所有清理和设置的例程。因此,TestCase子类中的每一种方法都是以“test”作为名词前缀,以标识它们能够被作为测试用例所运行。用户可以使用load方法和TestSuite类来分组、并加载各种测试。当然,您也可以通过联合使用,来构建自定义的测试运行器。正如我们使用Junit去测试Selenium那样,UnitTest也会用到UnitTest-sml-reporting、并能生成各种XML类型的报告。使用先决条件由于UnitTest默认使用了Python,因此我们并不需要什么先决条件。除了需要具备Python框架的基本知识,您也可以额外地安装pip、以及用于开发的IDE工具。优点开发人员并不需要安装任何其他的模块。UnitTest是xUnit的衍生产品,其工作原理与其他xUnit框架十分类似。因此对于那些没有过硬Python背景的人来说,也能很快地上手。用户能够以更为简单的方式运行单个测试用例。您只需在终端上预定好名称,该框架便可灵活地执行各种用例的测试,并产生精炼的输出。它能够在几毫秒内生成各种测试报告。缺点虽然该框架常用snake_case来命名各种Python代码,但是由于它源自Junit,因此仍保留了一些传统的camelCase命名方法。这往往会让人产生混淆。由于它过多地支持了抽象方法,因此造成了测试代码的目的有时不够清晰。 需要大量的样板代码。PyUnit的特点与竞品比较和部分Python开发人员的观点相似,我认为:Pytest能够培养测试人员以非常紧凑的方式编写出更好的自动化代码,这一编程习惯。尽管UnitTest是Python默认的自动化测试框架,但是其工作原理、及命名规则仍与标准的Python代码略有不同。同时,它也需要太多的样板代码。因此该框架并不太受欢迎。4.Behave我们都知道:行为驱动开发(behavior-driven development,BDD),是一种基于敏捷软件开发的方法。它能够鼓励开发人员、业务参与者和QA人员,三者之间的协作。作为另一种Python测试框架,Behave允许团队避开各种复杂的情况,去执行BDD测试。从本质上说,该框架与SpecFlow和Cucumber非常相似,常被用于执行自动化测试。用户可以通过简单易读的语言来编写测试用例,并能够在其执行期间粘贴到代码之中。而且,那些被设定的行为规范与步骤,也可以被重用到其他的测试方案中。使用先决条件任何具备Python基础知识的人都可以使用Behave。其他先决条件还包括:您必须先安装Python 2.7.14及以上的版本。需要通过Python包管理器或pip来与Behave协作。大多数开发人员会选择Pycharm作为开发环境,当然您也可以选用其他的IDE工具。优点由于系统行为使用了半正式(semi-formal)语言、以及域词汇表(domain vocabulary),因此Behave有助于在组织中保持一致性的行为。让那些工作在不同模块上的开发团队,通过协调处理来具有类似的特征。其构建的各个功能块能够执行各种测试用例。由于具有更多值得用户推理和思考的细节,因此目标产品会具有更好的规范性。根据类似的规范格式,它能够让项目经理和利益相关者,对开发团队和QA团队的输出具有更清楚地了解。缺点只适用于黑盒测试。Behave的特点与竞品比较Behave最适合于诸如简单Web测试之类的黑盒测试。但是,对于那些具有复杂场景的集成测试与单元测试而言,Behave并不是一个很好的选择。作为Behave的替代品,一些开发与测试人员会推荐使用pytest-bdd。该工具融合了Pytest的所有优点,并实现了各种行为驱动测试的场景。如果您正在考虑使用Behave,那么您可以借用《Behave with Selenium》(请参见https://www.lambdatest.com/support/docs/display/TD/Behave+with+Selenium+-+Running+Behave+Automation+Scripts+on+LambdaTest+Selenium+Grid)中提到的自动化脚本。5.LettuceLettuce是另一种基于Cucumber和Python的行为驱动类自动化工具。Lettuce主要专注于那些具有行为驱动开发特征的普通任务。它不但简单易用,而且能够使得整个测试过程更流畅、甚至更有趣。使用先决条件您需要安装带有IDE的Python 2.7.14、及以上的版本。当然,您也可以使用Pycharm或任何其他IDE工具。同时,您还需要安装Python包管理器。优点和其他BDD测试框架类似,Lettuce能够让开发人员创建多个场景,并用简单的自然语言去描述不同的功能。根据类似的规范格式,开发与QA团队能够协调共事。对于黑盒测试而言,Lettuce非常适合于那些行为驱动的测试用例。缺点为了成功地实现行为驱动测试,开发团队、QA人员以及利益相关者之间需要持续进行沟通。倘若缺乏此类沟通,则会产生流程模糊不清,并让团队遇到问题。 竞品比较在普通开发人员和自动化测试人员看来,Cucumber在执行BDD测试方面更为实用。而在Python开发和QA人员看来,Pytest-bdd才是的。Pytest的强大之处在于:其框架实现了紧凑且易于理解的代码,并能紧密地结合到行为驱动的测试之中。结语综上所述,在上述五种自动化测试的Python框架中,Pytest、Robot Framework和UnitTest可主要用于功能与单元测试,而Lettuce和Behave仅适用于行为驱动测试。通过进一步比较,我们认为:对于功能测试而言,Pytest是的。如果您是基于Python自动化测试的新手,那么Robot Framework是的入门工具。虽然其功能有所受限,但是它非常容易上手。对于基于Python的BDD测试而言,Lettuce和Behave同样优秀。不过,如果你已经有了一定的Pytest经验,那么请使用Pytest-bdd,希望本文能够帮助您选出合适的Python测试框架,并顺利开展测试工作。
  • [问题求助] 使用excelKillProcess结束Excel进程时报错,远程过程调用失败
    在关闭excel时,使用结束excel进程空间时弹出报错,‘远程过程调用失败’,尝试使用关闭工作簿时会报错‘RPC服务器不可用’,请问如何解决此问题
  • [技术交流] 单元测试
     1         单元测试的重要性1.1      一些错误的认识在实际的单元测试过程中总会有一些错误的认识左右着我们,使之成为单元测试最大的障碍,在此将其一一分析如下:它太浪费时间了,现在要赶进度,时间上根本不允许,或者随便做做应付领导。我是一个很棒的程序员,我写的代码肯定是没有问题的。做单元测试太烦了,直接集成,到时有问题在集成测试时肯定能发现的,实在不行在系统测试总该能发现吧。它仅仅是证明这些代码做了什么。对于以上错误认识的产生归根结底还是由于对单元测试的理解还是不够,没有真正认识到单元测试的重要性。1.2      测试的重要性单元测试是软件测试的基础,因此单元测试的效果会直接影响到软件的后期测试,最终在很大程度上影响到产品的质量。从如下几个方面就可以看出单元测试的重要性在何处。时间方面:如果认真的做好了单元测试,在系统集成联调时非常顺利,因此会节约很多时间,反之那些由于因为时间原因不做单元测试或随便做做的则在集成时总会遇到那些本应该在单元测试就能发现的问题,而这种问题在集成时遇到往往很难让开发人员预料到,最后在苦苦寻觅中才发现这是个很低级的错误而在悔恨自己时已经浪费了很多时间,这种时间上的浪费一点都不值得,正所谓得不偿失。 测试效果:根据以往的测试经验来看,单元测试的效果是非常明显的,首先它是测试阶段的基础,做好了单元测试,在做后期的集成测试和系统测试时就很顺利。其次在单元测试过程中能发现一些很深层次的问题,同时还会发现一些很容易发现而在集成测试和系统测试很难发现的问题。再次单元测试关注的范围也特殊,它不仅仅是证明这些代码做了什么,最重要的是代码是如何做的,是否做了它该做的事情而没有做不该做的事情。测试成本:在单元测试时某些问题就很容易发现,如果在后期的测试中发现问题所花的成本将成倍数上升。比如在单元测试时发现1个问题需要1个小时,则在集成测试时发现该问题需要2个小时,在系统测试时发现则需要3个小时,同理还有定位问题和解决问题的费用也是成倍数上升的,这就是我们要尽可能早的排除尽可能多的bug来减少后期成本的因素之一。 产品质量:单元测试的好与坏直接影响到产品的质量,可能就是由于代码中的某一个小错误就导致了整个产品的质量降低一个指标,或者导致更严重的后果,如果我们做好了单元测试这种情况是可以完全避免的。    综上所述,单元测试是构筑产品质量的基石,我们不要因为节约单元测试的时间不做单元测试或随便做而让我们在后期浪费太多的不值得的时间,我们也不愿意因为由于节约那些时间导致开发出来的整个产品失败或重来!1.3      具有的优点1. 它是一种验证行为。程序中的每一项功能都是测试来验证它的正确性,为以后的开发提供支缓。就算是开发后期,我们也可以轻松的增加功能或更改程序结构,而不用担心这个过程中会破坏重要的东西。而且它为代码的重构提供了保障,这样,我们就可以更自由的对程序进行改进。2.它是一种设计行为。编写单元测试将使我们从调用者观察、思考,特别是先写测试(test-first),迫使我们把程序设计成易于调用和可测试的,即迫使我们解除软件中的耦合。另外还可以使编码人员在编码时产生预测试,将程序的缺陷降低到最小。3.它是一种编写文档的行为。单元测试是一种无价的文档,它是展示函数或类如何使用的最佳文档。这份文档是可编译、可运行的,并且它保持最新,永远与代码同步。4.它具有回归性。自动化的单元测试避免了代码出现回归,编写完成之后,可以随时随地的快速运行测试。 2         单元测试的基本理论2.1      基本概念1. 单元测试:单元测试又称模块测试,属于白盒测试,是最小单位的测试。模块分为程序模块和功能模块。功能模块指实现了一个完整功能的模块(单元),一个完整的程序单元具备输入、加工和输出三个环节。而且每个程序单元都应该有正规的规格说明,使之对其输入、加工和输出的关系做出名明确的描述。2.测试驱动:驱动被测试模块正常运行起来的实体3.测试桩:代替被测模块调用的子模块的实体,该实体一般为桩函数。4. 测试覆盖:评测测试过程中已经执行的代码的多少。5.覆盖率:代码的覆盖程度,一种度量方式。针对代码的测试覆盖率有许多种度量方式,定义如下: 语句覆盖(StatementCoverage):也称为行覆盖(linEC),段覆盖(segmentcoverage)和基本块覆盖(bAS)。它度量每一个可执行语句是否被执行到了。icblockcoverageoverage判定覆盖(DecisionCoverage):也被称为分支覆盖(branchcoverage),所有边界覆盖(all-edgescoverage),基本路径覆盖(basispathcoverage),判定路径覆盖(decision-decision-path或DDPtesting)。它度量是否每个BOO型的表达式取值true和false在控制结构中都被测试到了。L 条件覆盖(ConDI):它独立的度量每一个子表达式,报告每一个子表达式的结果的true或false。这个度量和判定覆盖(decisioncoverage)相似,但是对控制流更敏感。不过,完全的条件覆盖并不能保证完全的判定覆盖。tionCoverage 路径覆盖(PathCoverage):也称为断言覆盖(prEDI),它度量了是否函数的每一个可能的分支都被执行了。路径覆盖的一个好处是:需要彻底的测试。但有两个缺点:一是,路径是以分支的指数级别增加的,例如:一个函数包含10个IF语句,就有1024个路径要测试。如果加入一个IF语句,路径数就达到2048;二是,许多路径不可能与执行的数据无关。catecoverage循环覆盖(LOOP):这个度量报告你是否执行了每个循环体零次、只有一次还是多余一次(连续地)。对于do-while循环,循环覆盖报告你是否执行了每个循环体只有一次还是多余一次(连续地)。这个度量的有价值的方面是确定是否对于while循环和for循环执行了多于一次,这个信息在其它的覆盖率报告中是没有的。 2.2      测试的内容单元测试的对象是软件设计的最小单位——模块或函数,单元测试的依据是详细设描述。测试者要根据详细设计说明书和源程序清单,了解模块的I/O条件和模块的逻辑结构。主要采用白盒测试的测试用例,辅之以黑盒测试的测试用例,使之对任何合理和不合理的输入都能鉴别和响应。要求对所有的局部和全局的数据结构、外部接口和程序代码的关键部分进行桌面检查和代码审查。在单元测试中,需要对下面5个方面的内容进行测试,也是构造测试用例的基础。1)   模块接口:测试模块的数据流。如果数据不能正确地输入和输出,就谈不上进行其他测试。因此,对于模块接口需要如下的测试项目:调用所测模块时的输入参数与模块的形式参数在个数、属性、顺序上是否匹配;所测模块调用子模块时,它输入个子模块的参数与子模块的形式参数在个数、属性、顺序上是否匹配;是否修改了只做输入用的形式参数;输出给标准函数的参数在个数、属性、顺序上是否匹配;全局变量的定义在各模块中是否一致; 限制是否通过形式参数来传送。2)  局部数据结构测试:模块的局部数据结构是最常见的错误来源,应设计测试用例以检查以下各种错误: 检查不正确或不一致的数据类型说明;使用尚未赋值或尚未初始化的变量; 错误的初始值或错误的默认值;变量名拼写错误或书写错误; 不一致的数据类型。3)路径测试:对基本执行路径和循环进行测试会发现大量的错误。根据白盒测试和黑盒测试用例设计方法设计测试用例。设计测试用例查找由于错误的计算、不正确的比较或不正常的控制流而导致的错误。常见的不正确的计算有:Ø         运算的优先次序不正确或误解了运算的优先次序;Ø         运算的方式错误(运算的对象彼此在类型上不相容);Ø         算法错误;Ø         初始化不正确;Ø         运算精度不够;Ø         表达式的符号表示不正确等。 常见的比较和控制流错误有:Ø         不同数据类型的比较;Ø         不正确的逻辑运算符或优先次序;Ø         因浮点运算精度问题而造成的两值比较不等;Ø         关系表达式中不正确的变量和比较符;Ø         “差1错”,即不正确地多循环或少循环一次;Ø         错误的或不可能的循环终止条件;Ø         当遇到发散的迭代时不能终止循环;Ø         不适当地修改了循环变量等。4) 错误处理测试:比较完善的模块设计要求能预见出错的条件,并设置适当的出错处理对策,以便在程序出错时,能对出错程序重新做安排,保证其逻辑上的正确性。这种出错处理也是模块功能的一部分。表明出错处理模块有错误或缺陷的情况有:出错的描述难以理解;出错的描述不足以对错误定位和确定出错的原因;显示的错误与实际的错误不符;对错误条件的处理不正确;在对错误进行处理之前,错误条件已经引起系统的干预; 如果出错情况不予考虑,那么检查恢复正常后模块可否正常工作。5) 边界测试:边界上出现错误上常见的。设计测试用例检查: 在n次循环的第0次、1次、n次是否有错误;运算或判断中取最大最小值时是否有错误;数据流、控制流中刚好等于、大于、小于确定的比较值时是否出现错误。 2.3      测试的环境构成何时进行单元测试?单元测试在编码阶段进行。在源程序代码编制完成、经过评审和验证、确认没有语法错误之后,就可以开始进行单元测试的测试用例设计。要利用软件设计文档,设计可以验证程序功能、找出程序错误的多个测试用例。对于每一组输入,应该有预期的正确结果。在单元测试时,如果模块不是独立的程序,需要辅助测试模块,有两种辅助模块:驱动模块(Driver):所测模块的主程序。它接收测试数据,把这些数据传递给所测试模块,最后再输出测试结果。当被测试模块能完成一定功能时,也可以不要驱动模块。 桩模块(Stub):用来代替所测模块调用的子模块。      被测试模块、驱动模块和桩模块共同构成了一个测试环境,如下图所示:3         测试方法与过程3.1      用例设计1.测试用例的组成(在单元测试中测试用例基本上由测试脚本组成)用例运行前置条件被测模块/单元所需环境(全局变量赋值或初始化实体)启动测试驱动设置桩调用被测模块设置预期输出条件判断2.测试用例的设计原则一个好的测试用例在于能够发现至今没有发现的错误;测试用例应由测试输入数据和与之对应的预期输出结果这两部分组成;在测试用例设计时,应当包含合理的输入条件和不合理的输入条件;为系统运行起来而设计测试用例;为正向测试而设计测试用例;为逆向测试而设计测试用例;为满足特殊需求而设计测试用例;为代码覆盖而设计测试用例;3.用例设计方法1)        规范(规格)导出发2)        等价类划分法3)        边界值分析法4)        状态转移测试法5)        分支测试法6)        条件测试法7)        数据定义-使用测试法(又名数据流测试法)8)        内部边界值测试法9)        错误猜测法4. 特定的用例测试设计1)声明测试:检查模块中的所有变量是否被声明。经验表明,大量重要的错误都是由于变量没有被声明或没有被正确的声明而引起的。2)路径测试:要求模块中所有可能的路径都被执行一遍,属逻辑覆盖测试。基本路径测试:由于实际中,一个模块中的路径可能非常多,由于时间和资源有限,不可能一一测试到。这就需要把测试所有可能路径的目标减少到测试足够多的路径,以获得对模块的信心。要测试的最小路径集就是基本测试路径集。基本测试路径集要保证:每个确定语句的每一个方向要测试到;每条语句最少执行一次。3)循环测试:重点检查循环的条件-判断部分以及边界条件。测试循环是一种特殊的路径测试,因为循环比其他语句都复杂一些。循环中错误的发生机会比其他代码构成部分多。因此,对于任何给定的循环测试应该包括测试下面每一条件的测试用例: 循环不执行; 执行一次循环;执行两次循环;反映执行典型的循环的执行次数;如果有最大循环次数,最大循环次数减1;最大循环次数;大于最大循环次数。对于增量和减量不是1的FOR语句,要特别注意,因为程序员习惯于增量1。4) 循环嵌套:循环嵌套使逻辑的次数呈几何级数增长,设计测试嵌套循环的测试用例应该包括的测试条件有:把外循环设置为最小值,并运行内循环所有可能的情况;把内循环设置为最小值,并运行外循环所有可能的情况;把所有的循环变量都设置为最小值运行;把所有的循环变量都设置为最大值运行; 把外循环设置为最大值,并运行内循环所有可能的情况;把内循环设置为最大值,并运行外循环所有可能的情况;5) 边界值测试:指程序内部边界测试。检查确定代码在任何边界情况下都不会出差错。重点检查小于、等于和大于边界条件的情况。边界值测试是指专门设计用来测试当条件语句中引用的值处在边界或边界附近时系统反映的测试。被测试语句的最好的例子就是“IF-THEN…ELSE-ENDIF”部分。这样语句的例子如:IF a <= 123 THENb = 1ELSE IF a >= 123 THENb = 2ELSE b = 3END IF           上面例子中的边界值测试用例应该至少包括a的以下值:122,123,124。当a=123时,b=1还是2。(找出逻辑判断的矛盾)6)接口测试:检查模块的数据流(输入、输出)是否正确。检查输入的参数和声明的自变量的个数,数据类型和输入顺序是否一致。检查全局变量是否被正确的定义和使用等。7)确认测试:是否接受有效输入数据(操作),拒绝无效数据(操作)。8)事务测试:输入->输出,错误处理。3.2      用例执行一般来说,做单元测试均采用的是商用的测试工具或自行开发的测试工具,用例的编写都是在测试工具上完成,测试用例都是一些测试脚本,都以文件的方式来保存,故其用例的执行过程主要是由测试工具根据所编写的具体的测试用例脚本来完成,这样对于用例的管理和执行也非常灵活。在特定场合,比如某种压力测试或极限测试,对于测试执行过程时间很长时(几个小时以上),一般都预先编写好用例(确保用例无误),使用空闲机或非工作时间执行测试用例,这样操作起来较节约时间。在用例的执行过程中务必注意如下事项: 程序的执行过程―――便于构造发散用例不要放过任何细节―――这种细节可能就是问题 3.3      测试优化和策略在测试的过程中为了提高测试效率和效果,不断的减少冗余劳动,也为后期的回归测试和测试管理带来很大的方便,不至于感到测试很混乱无序。因此我们要对测试用例和测试执行进行不断的优化,以测试策略为指导方针进行测试。1、测试用例的优化    测试用例的优化主要是指用例的合并、修改和删除,减少冗余的无价值的测试,其优化依据来源于测试后的测试数据分析和评估,其中测试覆盖也是用例优化的主要参考。2、测试执行的优化        测试执行的优化主要是指测试步骤的优化,减少测试人员的手工操作,因为太多的手工操作会导致测试人员很厌倦,直接影响测试效果,优化依据来源于测试总结。3、测试策略    在测试过程中由于时间或资源的原因可能会使测试处于紧张的局面,在此情况下我们要采取一定的策略来解决此局面。策略来源于测试数据的分析,主要的方法是:为各模块制定测试优先级,其优先级的划分依据如下:哪些是重点模块? 哪些程序是最复杂、最容易出错的? 哪些程序是相对独立,应当提前测试的? 哪些程序最容易扩散错误?哪些程序是开发者最没有信心的? 80-20原则:80%的缺陷聚集在20%的模块中,经常出错的模块改错后还会经常出错,这种应该列入测试重点。 3.4      测试评估   单元测试完成以后,需要对单元测试的执行效果进行评估,主要从以下几方面进行:1)测试完备性评估,主要检查测试过程中是否已经执行了所有的测试用例,对新增的测试用例是否已及时更新测试方案等。2)代码覆盖率评估,主要是根据代码覆盖率工具提供的语句覆盖情况报告,检查是否达到方案中的要求,公司要求语句覆盖达到100%。但很多情况下,第一轮测试用例执行完后是很难达到的,这时在评估过程中要对覆盖率进行分析,主要从以下方面来考虑:不可能的路径或条件不可达的或冗余的代码不充分的测试用例3) 从覆盖的角度看,测试应该覆盖: 功能覆盖 输入域覆盖输出域覆盖函数交互覆盖代码执行覆盖   大多数有效的测试用例都来自于分析,而不是仅仅为了达到测试覆盖率目标而草率设计测试用例。千万不要误解测试覆盖,测试覆盖并不是我们最求的目的,它只是评价测试的一种方式,为测试提供指导和依据。3.5      测试过程1.测试过程中各种人员的作用系统分析设计人员     进行需求跟踪,确保系统需求的实现和更新。进行软件单元可测性分析,确定单元测试的对象、范围和方法。软件开发人员     负责编码和单元测试过程,完成单元测试计划、方案和报告。软件测试人员     参与单元测试计划、方案和报告的评审,对单元测试的计划、设计和执行质量进行监控。根据实际情况,可选择参与由开发人员负责的代码检视、单元测试等活动。 配置管理人员    对代码及单元测试文档进行配置管理。质量保证(QA)人员     参与编码与单元测试评审,对编码和单元测试过程进行审计。2.  单元测试输入《软件需求规格说明书》《软件详细设计说明书》《软件编码与单元测试工作任务书》《软件集成测试计划》《软件集成测试方案》用户文档3.单元测试的输出《单元测试计划》《单元测试方案》《需求跟踪说明书》或需求跟踪记录 代码静态检查记录《正规检视报告》 问题记录 问题跟踪和解决记录软件代码开发版本《单元测试报告》《软件编码与单元测试任务总结报告》3.6      测试实施1.  单元测试实施步骤1)        制定测试计划和测试方案(包括测试工具的选择)2)        根据计划和方案及相关输入文档编写测试用例3)        搭建测试环境4)        执行测试5)        记录和跟踪问题6)        编写测试报告和总结报告2.  单元测试实施遵循的原则 精心制定测试计划 严格评审测试计划 严格执行测试计划系统分析测试结果并提交报告4         常用测试工具介绍常用的C语言单元测试工具介绍如下: winAMS、CasePlayer21)        简介GAIO公司的覆盖率专家winAMS获得机能安全标百准ISO26262/IEC61508工具认证,是日本工业制造度领域普遍使用的针对C/C++的单元/集成测试工具。winAMS将通过交叉编译生成的原始代码作为评价代码,具有使用芯片仿真器进行仿真功能的测试工具。不仅可以对C/C++语言编写的程序进行逻辑水平的测试,还可以对嵌入式软件特有的依存于芯片的问题点进行确认。2)        功能特性尽可能使单元测试的环境与目标环境相同采用全面支持嵌入式微机的微机化功能测试平台环境不需要插入测试用代码直接使用目标机代码进行测试取得第三方认证机构TUVSUD对适用于汽车机能安全ISO26262软件工具的认证测试工程管理