Web 自动化测试用例智能推理生成
利用爬虫进行领域建模
编写 Web 爬虫
- 打开网站
- 获取关键元素
- 遍历点击下个元素
- 继续获取元素
- ...
- 详情参考智能遍历与爬虫章节
crawler = WebCrawler(browser='firefox')
crawler.crawl(
'https://ceshiren.com',
scope=[
'a[href]'
]
)
领域建模结果
\
页面状态 Start -> 动作事件 Event -> 页面状态 Stop
提取所有测试路径
提取从根节点到所有叶子节点的每条测试路径。这代表了从首页开始,到所有潜在未被测试到的状态。
\
MATCH path = (root:Page)-[*]->(leaf)
WHERE NOT (leaf)-->() AND NOT () --> (root)
RETURN path
自动化测试用例生成
自动化测试用例生成
def test_auto_testcase_gen():
template_service = TemplateService()
g = GraphService()
paths = g.get_leaf_paths()
testcase_list = []
for path in paths:
steps = []
for node in path:
if isinstance(node, Page):
# 状态节点代表断言
steps.append(f'# 验证已经打开了页面 url={node.url} 页面标题={node.title}')
steps.append(f'assert self.driver.current_url == {repr(node.url)}')
elif isinstance(node, ActionRel):
# 事件节点关系节点代表动作变化
steps.append(f'# 针对控件 {node.locator} 执行 {node.action} 动作')
steps.append(
f'self.driver.find_element(By.CSS_SELECTOR, {repr(node.locator)}).{node.action}()'
)
else:
print(node)
testcase_list.append(steps)
result = template_service.render(
'demo.jinja', context={
'class_name': 'Ceshiren',
'testcase_list': testcase_list
}
)
Path('test_generate2.py').write_text(result)
\
获得所有的潜在测试路径,把行为事件转成动作代码,把页面状态节点转成断言
测试用例生成效果
class TestCeshiren:
def setup_method(self):
self.driver = webdriver.Firefox()
self.driver.implicitly_wait(5)
self.driver.get('https://ceshiren.com')
def test_1(self):
# 验证已经打开了页面 url=https://ceshiren.com/ 页面标题=爱测-测试人社区 - 软件测试开发爱好者的交流社区,交流范围涵盖软件测试、自动化测试、UI测试、接口测试、性能测试、安全测试、测试开发、测试平台、开源测试、测试教程、测试面试题、appium、selenium、jmeter、jenkins
assert self.driver.current_url == 'https://ceshiren.com/'
# 针对控件 a.active 执行 click 动作
self.driver.find_element(By.CSS_SELECTOR, 'a.active').click()
# 验证已经打开了页面 url=https://ceshiren.com/ 页面标题=爱测-测试人社区 - 软件测试开发爱好者的交流社区,交流范围涵盖软件测试、自动化测试、UI测试、接口测试、性能测试、安全测试、测试开发、测试平台、开源测试、测试教程、测试面试题、appium、selenium、jmeter、jenkins
assert self.driver.current_url == 'https://ceshiren.com/'
# 针对控件 a.title raw-link raw-topic-link 执行 click 动作
self.driver.find_element(By.CSS_SELECTOR, 'a.title raw-link raw-topic-link').click()
# 验证已经打开了页面 url=https://ceshiren.com/t/topic/7 页面标题=欢迎光临测试人社区 | Powered by 霍格沃兹测试开发学社 - 未分类 - 爱测-测试人社区
assert self.driver.current_url == 'https://ceshiren.com/t/topic/7'
# 针对控件 a.fancy-title 执行 click 动作
self.driver.find_element(By.CSS_SELECTOR, 'a.fancy-title').click()
# 验证已经打开了页面 url=https://ceshiren.com/t/topic/7/1 页面标题=欢迎光临测试人社区 | Powered by 霍格沃兹测试开发学社 - 未分类 - 爱测-测试人社区
assert self.driver.current_url == 'https://ceshiren.com/t/topic/7/1'
# 针对控件 a.trigger-user-card main-avatar 执行 click 动作
self.driver.find_element(By.CSS_SELECTOR, 'a.trigger-user-card main-avatar ').click()
# 验证已经打开了页面 url=https://ceshiren.com/t/topic/7/1 页面标题=欢迎光临测试人社区 | Powered by 霍格沃兹测试开发学社 - 未分类 - 爱测-测试人社区
assert self.driver.current_url == 'https://ceshiren.com/t/topic/7/1'
# 针对控件 a.widget-link post-date 执行 click 动作
self.driver.find_element(By.CSS_SELECTOR, 'a.widget-link post-date').click()
# 验证已经打开了页面 url=https://ceshiren.com/t/topic/7/1 页面标题=欢迎光临测试人社区 | Powered by 霍格沃兹测试开发学社 - 未分类 - 爱测-测试人社区
assert self.driver.current_url == 'https://ceshiren.com/t/topic/7/1'
# 针对控件 a.topic-excerpt 执行 click 动作
self.driver.find_element(By.CSS_SELECTOR, 'a.topic-excerpt').click()
# 验证已经打开了页面 url=https://ceshiren.com/t/topic/7 页面标题=欢迎光临测试人社区 | Powered by 霍格沃兹测试开发学社 - 未分类 - 爱测-测试人社区
assert self.driver.current_url == 'https://ceshiren.com/t/topic/7'
# 针对控件 a.latest 执行 click 动作
self.driver.find_element(By.CSS_SELECTOR, 'a.latest').click()
# 验证已经打开了页面 url=https://ceshiren.com/ 页面标题=爱测-测试人社区 - 软件测试开发爱好者的交流社区,交流范围涵盖软件测试、自动化测试、UI测试、接口测试、性能测试、安全测试、测试开发、测试平台、开源测试、测试教程、测试面试题、appium、selenium、jmeter、jenkins
assert self.driver.current_url == 'https://ceshiren.com/'
# 针对控件 a.latest single group-ceba 执行 click 动作
self.driver.find_element(By.CSS_SELECTOR, 'a.latest single group-ceba').click()
# 验证已经打开了页面 url=https://ceshiren.com/ 页面标题=爱测-测试人社区 - 软件测试开发爱好者的交流社区,交流范围涵盖软件测试、自动化测试、UI测试、接口测试、性能测试、安全测试、测试开发、测试平台、开源测试、测试教程、测试面试题、appium、selenium、jmeter、jenkins
assert self.driver.current_url == 'https://ceshiren.com/'
# 针对控件 a.card-huge-avatar 执行 click 动作
self.driver.find_element(By.CSS_SELECTOR, 'a.card-huge-avatar').click()
# 验证已经打开了页面 url=https://ceshiren.com/u/dinglianhua/summary 页面标题=摘要 - dinglianhua - 爱测-测试人社区
assert self.driver.current_url == 'https://ceshiren.com/u/dinglianhua/summary'
# 针对控件 a.ember-view active 执行 click 动作
self.driver.find_element(By.CSS_SELECTOR, 'a.ember-view active').click()
# 验证已经打开了页面 url=https://ceshiren.com/u/dinglianhua/summary 页面标题=摘要 - dinglianhua - 爱测-测试人社区
assert self.driver.current_url == 'https://ceshiren.com/u/dinglianhua/summary'
# 针对控件 a.ember-view 执行 click 动作
self.driver.find_element(By.CSS_SELECTOR, 'a.ember-view').click()
# 验证已经打开了页面 url=https://ceshiren.com/u/dinglianhua/activity 页面标题=所有 - 活动 - dinglianhua - 爱测-测试人社区
assert self.driver.current_url == 'https://ceshiren.com/u/dinglianhua/activity'
# 针对控件 a.avatar-link 执行 click 动作
self.driver.find_element(By.CSS_SELECTOR, 'a.avatar-link').click()
# 验证已经打开了页面 url=https://ceshiren.com/u/dinglianhua/activity 页面标题=所有 - 活动 - dinglianhua - 爱测-测试人社区
assert self.driver.current_url == 'https://ceshiren.com/u/dinglianhua/activity'
def test_28(self):
# 验证已经打开了页面 url=https://ceshiren.com/ 页面标题=爱测-测试人社区 - 软件测试开发爱好者的交流社区,交流范围涵盖软件测试、自动化测试、UI测试、接口测试、性能测试、安全测试、测试开发、测试平台、开源测试、测试教程、测试面试题、appium、selenium、jmeter、jenkins
assert self.driver.current_url == 'https://ceshiren.com/'
# 针对控件 a.active 执行 click 动作
self.driver.find_element(By.CSS_SELECTOR, 'a.active').click()
# 验证已经打开了页面 url=None 页面标题=None
assert self.driver.current_url == None
总结
- 领域知识图谱建模:爬虫、抓包、文档生成
- 模型驱动测试:分析知识图谱并获取潜在待测试路径
- 自动化用例生成:使用模版技术生成测试用例