zoukankan      html  css  js  c++  java
  • testNG优雅的使用注解让你的测试项目开发更高效!

    testNG大部分是通过xml配置测试类和监听类

    • 但是这种方法就像传统的spring框架一样需要引入大量的xml配置信息,而且在各层之间也需要通过new对象传递。如果testNG能使用注解注入bean对象,那么完成一个自动化项目的开发周期必然会缩短很多。于是在spring官网看到支持TestNG Support Classes。大致说明如下:

      官方文档地址
      可以通过抽象类AbstractTestNGSpringContextTests,实现bean查找或测试整个上下文的状态。

    现在大部分后端项目是springboot框架,下面就以springboot框架结合testNG实现注解注入bean实例介绍:

    • 首先想要通过注解注入bean对象,需要基础的测试类继承抽象AbstractTestNGSpringContextTests类,同时基础测试类还需要加上@SpringBootTest注解和通用@Component注解,这样就能在各层通过@Component通用注解实现bean对象的传递。
    • 基础测试类注入如下:
    @Slf4j
    @Component
    @SpringBootTest
    public class BaseTest  extends AbstractTestNGSpringContextTests{
        /**
         * 驱动基类
         */
        @Autowired
        private BaseChromeDriver baseDriver;
        /**
         * 驱动
         * 对外暴露
         */
        public WebDriver driver;
    }
    
    • testcase层使用注解注入元素操作层对象,示例如下:
    @Listeners(com.iwebui.listener.AssertListener.class)
    public class BaiduLoginCase extends BaseTest {
        @Autowired
        private BaiDuCaseEasypoiHandle baiDuCaseEasypoiHandle;
        @Autowired
        BaiDuCaseJpaHandle baiDuCaseJpaHandle;
        /**
         * easypoi实现excel数据驱动
         */
        @Severity( SeverityLevel.NORMAL)
        @Description("百度登录测试示例--使用easypoi实现")
        @Test
        public void baibaiDuCaseEasypoiHandle(){
            //初始化ticketElement,获取驱动
            baiDuCaseEasypoiHandle.serchBaidu(driver);
            //excel数据驱动测试-使用easypoi实现
            baiDuCaseEasypoiHandle.loginCase(driver);
        }
        /**
         * JPA实现数据库数据驱动示例
         */
        @Severity( SeverityLevel.NORMAL)
        @Description("百度登录测试示例--使用springDataJPA实现")
        @Test
        public void baiDuCaseJpaHandle(){
            //进入被测网址
            baiDuCaseJpaHandle.serchBaidu(driver);
            //数据库驱动,使用jpa实现
            baiDuCaseJpaHandle.getAll(driver);
        }
    }
    
    • 元素操作层同样可以使用注解注入dao层对象,示例如下:
    @Component
    public class BaiDuCaseJpaHandle extends BaseBrowser {
        @Autowired
        private BaiDuLoginDao baiDuLoginDao;
        @Autowired
        private BaiDuUrlDao baiDuUrlDao;
    
        public void serchBaidu(WebDriver driver){
            log.info("开始进入被测页面");
            enterPage(driver,AccountData.BAIDUURL);
        }
    
        public List<Logincase> getAll(WebDriver driver) {
            UIElementUtil.clickButton("百度登录","点击右上角登录按钮",driver);
            UIElementUtil.clickButton("百度登录","点击账号密码登录按钮",driver);
            List<Logincase> logincaseList = baiDuLoginDao.findAll();
            List<UrlMessage> urlMessageList = baiDuUrlDao.findAll();
            //2.使用自定义写的sql方法操作数据库
            Map<Long, UrlMessage> map = new HashMap<>();
            urlMessageList.forEach(urlMessage -> {
                map.put(urlMessage.getId(), urlMessage);
            });
            logincaseList.forEach(logincase -> {
                String address = "";
                String actual = "";
                if (logincase.getCaseStatus().equals(1)) {
                    UrlMessage urlMessage = map.get(logincase.getUrlId());
                    if (urlMessage != null) {
                        address = urlMessage.getAddress();
                    }
                    if (!address.equals("")) {
                        baiDuLoginDao.updateLogincase(address, logincase.getId());
                    }
                    UIElementUtil.sendInput("百度登录","登录账号",driver,logincase.getName());
                    UIElementUtil.sendInput("百度登录","登录密码",driver,logincase.getPwd());
                    UIElementUtil.clickButton("百度登录","登录按钮",driver);
                    actual = driver.findElement(AccountData.TIPS).getText();
                    baiDuLoginDao.updateActual(actual,logincase.getId());
                }else {
                    UrlMessage urlMessage = map.get(logincase.getUrlId());
                    address = urlMessage.getAddress();
                    baiDuLoginDao.updateLogincase(address, logincase.getId());
                }
            });
            return null;
        }
    }
    
    • 由于使用springDataJPA大大简化了书写sql语句,直接继承JpaRepository接口即可。
    @Repository
    public interface BaiDuUrlDao extends JpaRepository<UrlMessage, Long> {
    }
    

    另外大多数testNG配置文件也是通过xml、config.properties来完成配置文件的加载,这种配置流程繁琐。而yaml文件的配置更简单上手,这里通过yaml配置文件完成配置参数的加载。testNG通过yaml文件配置如下:

    • 通过key|value形式加载配置文件,编写加载工具类如下:
    public class LoadStaticConfigUtil {
        public static Object getCommonYml(Object key){
            Resource resource = new ClassPathResource("/application-dev.yml");
            Properties properties = null;
            try {
                YamlPropertiesFactoryBean yamlFactory = new YamlPropertiesFactoryBean();
                yamlFactory.setResources(resource);
                properties =  yamlFactory.getObject();
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            }
            return properties.get(key);
        }
    }
    
    • yaml配置信息如下:

    • 然后就可以通过加载配置文件工具类,传入key即可

    这样就完成了yaml获取配置信息的过程,更多技术分享可以关注[Coding测试]公众号。

    点击获取该项目示例源码地址


    更多测试技术分享、学习资源以及一些其他福利可关注公众号:【Coding测试】获取:
    Coding测试

    记录工作中使用的CI/CD流程
  • 相关阅读:
    菜根谭#219
    菜根谭#218
    菜根谭#217
    菜根谭#216
    有了OpenMP,MPI,为什么还要MapReduce? (转载)
    人生就是一场战略
    SDAccel 开发环境
    各种加速卡 异构计算
    Nvidia Tesla (GPGPU)系列发展流程
    Nvidia 架构发展
  • 原文地址:https://www.cnblogs.com/CodingTest/p/13917611.html
Copyright © 2011-2022 走看看