测试自动化设计 - 969251639/study GitHub Wiki

原先的项目中,都是通过测试人员手工的在页面上或手机上一个一个功能的测试,效率实在太低,所以这里设计了一个类似自动化设计的无人工干扰的方案

实现思路

  1. 使用BlazeMeter录制请求,再将其生成jmeter的执行文件

  2. 将生成的jmeter的导入到jmeter中

  3. 将导入的请求中统一加一个header,表示要走自动化测试脚本

  4. 后台接收到这个header后完成数据处理后会自动进行数据回滚,防止数据污染

实现

  1. 拦截事务方法
@Aspect
@Component
@EnableAutoConfiguration
@ComponentScan
public class TransactionalAspect {
	public static final String TEST_UNIT = "testUnit";
	
	// Service层切点
	@Pointcut("@annotation(org.springframework.transaction.annotation.Transactional)")
	public void aspect() {
	}

	@Around("@annotation(transactional)")
	public Object around(ProceedingJoinPoint pjp, Transactional transactional) throws Throwable {
		RequestAttributes ra = RequestContextHolder.getRequestAttributes();
		if(ra == null) {
			return pjp.proceed();
		}
		ServletRequestAttributes sra = (ServletRequestAttributes) ra;
		HttpServletRequest request = sra.getRequest();
		String test = request.getHeader(TEST_UNIT);
		if(StringUtils.isBlank(test) || ForwardHessianConnectionFactory.THREAD_LOCAL.get() != null) {
			return pjp.proceed();
		}
		try {
			Object savepoint = TransactionAspectSupport.currentTransactionStatus().createSavepoint();
			ForwardHessianConnectionFactory.THREAD_LOCAL.set(TEST_UNIT);
			Object obj = pjp.proceed();
			TransactionAspectSupport.currentTransactionStatus().rollbackToSavepoint(savepoint);//回滚
			return obj;
		}finally {
			ForwardHessianConnectionFactory.THREAD_LOCAL.remove();
		}
		
	}

}

public class ForwardHessianConnectionFactory extends
		HessianURLConnectionFactory {//调用hessian的方法时
	public static final ThreadLocal<String> THREAD_LOCAL = new ThreadLocal<>();

	@Override
	public HessianConnection open(URL url) throws IOException {
		HessianURLConnection hessianURLConnection = (HessianURLConnection) super
				.open(url);
		String s = THREAD_LOCAL.get();
		if (StringUtils.isNotBlank(s)) {
			hessianURLConnection.addHeader(s, s);
		}
		return hessianURLConnection;
	}
 
}

上面最重要的是一定要先执行事务方法,拿到返回值,然后数据回滚后要将返回值已正确的方式返回回去,相当于调用发看到了正确的调用一样

  1. 微服务调用时自动将该header传递下去
@Component
public class FeignInterceptor implements RequestInterceptor {
    public void apply(RequestTemplate requestTemplate) {
    	RequestAttributes ra = RequestContextHolder.getRequestAttributes();
    	if(ra != null) {
    		ServletRequestAttributes sra = (ServletRequestAttributes) ra;
			HttpServletRequest request = sra.getRequest();
			String test = request.getHeader(TransactionalAspect.TEST_UNIT);
			if(StringUtils.isNotBlank(test)) {
				requestTemplate.header(TransactionalAspect.TEST_UNIT, test);
			}
		}
    }
}

问题

虽然上面的实现可以让测试人员通过录制的脚本快速测试接口的正确性,但问题依旧不少,下面是以后的优化方向

  1. BlazeMeter是Chrome的插件,只能录制web应用,对于移动端应用则毫无办法
  2. 数据做回滚,采用拦截事务方法,那么如果是真正的delete的时候录制的接口是行不通,数据被删了,但脚本不知道
  3. 无法对真实流量采集测试

解决思路:

  1. 后台做埋点,可以将接收到的请求收集起来作分析(也可以针对具体的用户做分析),然后用代码生成jmeter的xml文件
  2. 数据流转时将其采集起来做mock方式解决
  3. 和1一样做埋点
⚠️ **GitHub.com Fallback** ⚠️