Skip to content

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

总结

  • 领域知识图谱建模:爬虫、抓包、文档生成
  • 模型驱动测试:分析知识图谱并获取潜在待测试路径
  • 自动化用例生成:使用模版技术生成测试用例