java 组合 遍历 算法_[Java][算法] 记一次失败的尝试 -- 基于全排列算法实现场景遍历...

缘由

由于当下测试的业务是基于任务流的,就是说在任务 1 完成后,可能会同时触发任务 2 和任务 3,任务 2 和任务 3 的提交顺序没有彼此依赖关系,

与此同时我设计的接口用例是按层次编写的,像下面的 Demo,

我就在想如果基于全排列,去自动排列组合出所有的场景,然后遍历执行这些场景,应该挺有意思的,

在一个 testSetList 中,用例是按顺序执行 testCaseList 的,但在同一个 testCaseList 中的用例顺序是可以无序执行的,

就是说一个用例集合中的用例是无序的,但用例集合之间的是有序的。

{"projectName":"Demo","testSetList":[{"testCaseList":[{"caseInfo":{"caseName":"login","caseOwner":"lishu","caseComment":"登录-胡斐"}}]},{"testCaseList":[{"caseInfo":{"caseComment":"雪山飞狐","caseName":"批发新款-提交"}}]},{"testCaseList":[{"caseInfo":{"caseComment":"雪山飞狐","caseName":"现货批发-增补供应商"}},{"caseInfo":{"caseComment":"雪山飞狐","caseName":"现货批发-下单"}}]},{"testCaseList":[{"caseInfo":{"caseComment":"雪山飞狐","caseName":"翻单-增补供应商"}},{"caseInfo":{"caseComment":"雪山飞狐","caseName":"下单审核-查询"}},{"caseInfo":{"caseComment":"雪山飞狐","caseName":"下单审核-不通过"}}]},{"testCaseList":[{"caseInfo":{"caseComment":"雪山飞狐","caseName":"现货批发-修改订单"}}]},{"testCaseList":[{"caseInfo":{"caseComment":"雪山飞狐","caseName":"下单审核-通过"}}]},{"testCaseList":[{"caseInfo":{"caseComment":"雪山飞狐","caseName":"文案任务-提交"}},{"caseInfo":{"caseComment":"雪山飞狐","caseName":"商品列表-试穿"}}]}]}

如何进行全排列? public class Producer {

public static void arrange(List apiTestCaseList, int start, int len, List> setResultApiTestCasesList) {

if (start == len - 1) {

// for (int i = 0; i < apiTestCaseList.size(); i++) {

// System.out.print(apiTestCaseList.get(i).getCaseInfo().getCaseName() + "--" + apiTestCaseList.get(i).getMethod() + ", ");

// }

// System.out.println();

CaseList caseList = new CaseList();

caseList.setApiTestCaseList(apiTestCaseList);

String temp = JSON.toJSONString(caseList);

setResultApiTestCasesList.add(JSON.parseObject(temp, CaseList.class).getApiTestCaseList());

return;

}

for (int i = start; i < len; i++) {

ApiTestCase temp = apiTestCaseList.get(start);

apiTestCaseList.set(start, apiTestCaseList.get(i));

apiTestCaseList.set(i, temp);

arrange(apiTestCaseList, start + 1, len, setResultApiTestCasesList);

temp = apiTestCaseList.get(start);

apiTestCaseList.set(start, apiTestCaseList.get(i));

apiTestCaseList.set(i, temp);

}

}

public static void main(String[] args) throws IOException {

long start = System.currentTimeMillis();

String apiTestProjectStr = ApiTestUtils.loadCases(

"/Users/xxxx/Downloads/workspace/java/demo/src/main/resources/demo.json");

ApiTestProject apiTestProject = JSON.parseObject(apiTestProjectStr, ApiTestProject.class);

LinkedList apiTestSets = apiTestProject.getTestSetList();

List> resultApiTestCasesList = new LinkedList<>();

for (ApiTestSet apiTestSet : apiTestSets) {

System.out.print("this set's first case:" + apiTestSet.getTestCaseList().get(0).getCaseInfo().getCaseName());

System.out.println(", size:" + apiTestSet.getTestCaseList().size());

List> setResultApiTestCasesList = new LinkedList<>();

arrange(apiTestSet.getTestCaseList(), 0, apiTestSet.getTestCaseList().size(), setResultApiTestCasesList);

if (setResultApiTestCasesList.size() == 1) {

if (resultApiTestCasesList.size() == 0) {

resultApiTestCasesList.add(setResultApiTestCasesList.get(0));

} else {

for (List resultList : resultApiTestCasesList) {

for (List setResultList : setResultApiTestCasesList) {

resultList.addAll(setResultList);

}

}

}

} else {

ResultList resultList = new ResultList();

resultList.setResultApiTestCasesList(new LinkedList<>());

resultList.getResultApiTestCasesList().addAll(resultApiTestCasesList);

// 对结果进行扩容

for (int i=0; i

String str = JSON.toJSONString(resultList);

ResultList tmp = JSON.parseObject(str, ResultList.class);

resultApiTestCasesList.addAll(tmp.getResultApiTestCasesList());

}

System.out.println("resultApiTestCasesList size:" + resultApiTestCasesList.size());

// 将结果分别填充至原场景末尾

for (int i=0; i

resultApiTestCasesList.get(i).addAll(setResultApiTestCasesList.get(i % setResultApiTestCasesList.size()));

}

}

setResultApiTestCasesList.clear();

}

System.out.println(resultApiTestCasesList.size());

for (List list : resultApiTestCasesList) {

for (ApiTestCase apiTestCase : list) {

System.out.print(apiTestCase.getCaseInfo().getCaseName() + " ");

}

System.out.println();

}

System.out.println("time:" + (System.currentTimeMillis() - start));

}

}

基本上是抄的别人的基于递归的全排列算法,自己改了改,基本上是搞定了

结果: login 批发新款-提交 现货批发-增补供应商 现货批发-下单 翻单-增补供应商 下单审核-查询 下单审核-不通过 现货批发-修改订单 下单审核-通过 文案任务-提交 商品列表-试穿

login 批发新款-提交 现货批发-下单 现货批发-增补供应商 翻单-增补供应商 下单审核-不通过 下单审核-查询 现货批发-修改订单 下单审核-通过 商品列表-试穿 文案任务-提交

login 批发新款-提交 现货批发-增补供应商 现货批发-下单 下单审核-查询 翻单-增补供应商 下单审核-不通过 现货批发-修改订单 下单审核-通过 文案任务-提交 商品列表-试穿

login 批发新款-提交 现货批发-下单 现货批发-增补供应商 下单审核-查询 下单审核-不通过 翻单-增补供应商 现货批发-修改订单 下单审核-通过 商品列表-试穿 文案任务-提交

login 批发新款-提交 现货批发-增补供应商 现货批发-下单 下单审核-不通过 下单审核-查询 翻单-增补供应商 现货批发-修改订单 下单审核-通过 文案任务-提交 商品列表-试穿

login 批发新款-提交 现货批发-下单 现货批发-增补供应商 下单审核-不通过 翻单-增补供应商 下单审核-查询 现货批发-修改订单 下单审核-通过 商品列表-试穿 文案任务-提交

login 批发新款-提交 现货批发-增补供应商 现货批发-下单 翻单-增补供应商 下单审核-查询 下单审核-不通过 现货批发-修改订单 下单审核-通过 文案任务-提交 商品列表-试穿

login 批发新款-提交 现货批发-下单 现货批发-增补供应商 翻单-增补供应商 下单审核-不通过 下单审核-查询 现货批发-修改订单 下单审核-通过 商品列表-试穿 文案任务-提交

login 批发新款-提交 现货批发-增补供应商 现货批发-下单 下单审核-查询 翻单-增补供应商 下单审核-不通过 现货批发-修改订单 下单审核-通过 文案任务-提交 商品列表-试穿

login 批发新款-提交 现货批发-下单 现货批发-增补供应商 下单审核-查询 下单审核-不通过 翻单-增补供应商 现货批发-修改订单 下单审核-通过 商品列表-试穿 文案任务-提交

login 批发新款-提交 现货批发-增补供应商 现货批发-下单 下单审核-不通过 下单审核-查询 翻单-增补供应商 现货批发-修改订单 下单审核-通过 文案任务-提交 商品列表-试穿

login 批发新款-提交 现货批发-下单 现货批发-增补供应商 下单审核-不通过 翻单-增补供应商 下单审核-查询 现货批发-修改订单 下单审核-通过 商品列表-试穿 文案任务-提交

login 批发新款-提交 现货批发-增补供应商 现货批发-下单 翻单-增补供应商 下单审核-查询 下单审核-不通过 现货批发-修改订单 下单审核-通过 文案任务-提交 商品列表-试穿

login 批发新款-提交 现货批发-下单 现货批发-增补供应商 翻单-增补供应商 下单审核-不通过 下单审核-查询 现货批发-修改订单 下单审核-通过 商品列表-试穿 文案任务-提交

login 批发新款-提交 现货批发-增补供应商 现货批发-下单 下单审核-查询 翻单-增补供应商 下单审核-不通过 现货批发-修改订单 下单审核-通过 文案任务-提交 商品列表-试穿

login 批发新款-提交 现货批发-下单 现货批发-增补供应商 下单审核-查询 下单审核-不通过 翻单-增补供应商 现货批发-修改订单 下单审核-通过 商品列表-试穿 文案任务-提交

login 批发新款-提交 现货批发-增补供应商 现货批发-下单 下单审核-不通过 下单审核-查询 翻单-增补供应商 现货批发-修改订单 下单审核-通过 文案任务-提交 商品列表-试穿

login 批发新款-提交 现货批发-下单 现货批发-增补供应商 下单审核-不通过 翻单-增补供应商 下单审核-查询 现货批发-修改订单 下单审核-通过 商品列表-试穿 文案任务-提交

login 批发新款-提交 现货批发-增补供应商 现货批发-下单 翻单-增补供应商 下单审核-查询 下单审核-不通过 现货批发-修改订单 下单审核-通过 文案任务-提交 商品列表-试穿

login 批发新款-提交 现货批发-下单 现货批发-增补供应商 翻单-增补供应商 下单审核-不通过 下单审核-查询 现货批发-修改订单 下单审核-通过 商品列表-试穿 文案任务-提交

login 批发新款-提交 现货批发-增补供应商 现货批发-下单 下单审核-查询 翻单-增补供应商 下单审核-不通过 现货批发-修改订单 下单审核-通过 文案任务-提交 商品列表-试穿

login 批发新款-提交 现货批发-下单 现货批发-增补供应商 下单审核-查询 下单审核-不通过 翻单-增补供应商 现货批发-修改订单 下单审核-通过 商品列表-试穿 文案任务-提交

login 批发新款-提交 现货批发-增补供应商 现货批发-下单 下单审核-不通过 下单审核-查询 翻单-增补供应商 现货批发-修改订单 下单审核-通过 文案任务-提交 商品列表-试穿

login 批发新款-提交 现货批发-下单 现货批发-增补供应商 下单审核-不通过 翻单-增补供应商 下单审核-查询 现货批发-修改订单 下单审核-通过 商品列表-试穿 文案任务-提交

踩到的坑

我也知道全排列的场景十分的多,但大部分业务流最多同时执行的也就 3,4 个场景,全排列的话也就 6,24 个,

一开始还是没觉得会有多少,直到做完了以后才发现那不是一般的多,多的有算出来 18000 多的,直接撑到 OOM 了

所以,一些小的场景还是可以玩一玩的,复杂的就算了吧。。。

如何对 list 进行复制?

一开始试了各种 java 原生方法,复制出来的结果都是一模一样的,

就是说 list.get(0) 与 list.get(1) 的==结果竟然是 true,导致修改其中一个,其他的也变掉了,

最后查了网上的资料,基本上只能用序列化与反序列化了。

更多思考

采用随机对比的方法?

get 接口单独放置,不参与排列组合,每次 post 提交完成后,调一遍?

将生成的组合丢到队列中去,慢慢跑

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值