最近接触到针对ceph的非功能性测试,提供的上传接口如下
上传public id upload(inputstream)
但是ceph本身类似于网盘,一个相同的文件上传上去,会返回相同的id
所以通过DFS不太好理解,网盘的话就比较容易理解了,因为服务器上并没有发生写操作,返回的是之前写过的一个文件
我们要测试…….要非功能性测试,涉及在上传过程中的骚操作,然后需要保证次数和文件数的一致
如果要保证每次都返回不一样的id,就需要每次都构造一个完全不一样的文件,文件内容整个UUID就能搞定,恶心的问题在接口上,在仔细看看上面的接口,是一个inputstream,而构造文件的输出一般是outputstream,所以问题的难点转换成,怎么把outputstream转换为inputstream??
想到这边,我突然想起大概在10年前,在阿里的面试上,当面试快结束的时候,面试官随口说的一个问题,当时我没有答上来,我反而在质疑为什么会有这种需求…拿易五的年轻时代啊…后面我也搜索过上述问题的解决方案,官方推荐的解决方法是使用pipeline进行操作
有些事情呢,只有做到了,才能Let it be,才能很轻巧的说,"也就那样吧…"
下面为示例代码
public static voidmain(String[] args)throws Exception{
finalPipedInputStream pipeIn = new PipedInputStream();
finalResult result = new Result();
Thread t = new Thread(new Runnable() {
@Override
publicvoid run() {
StreamTesttest = new StreamTest();
Stringuuid = test.input(pipeIn);
result.setUuid(uuid);
}
});
t.start();
PipedOutputStream pipeOut = newPipedOutputStream(pipeIn);
PrintWriter writer = new PrintWriter(newBufferedWriter(new OutputStreamWriter(pipeOut)));
for(int i = 0 ;i<10000;i++) {
writer.println("Comingthrough the pipe...senvon "+i);
writer.flush();
}
writer.close();
//等待t线程执行完成,否则result里面会获取不到uuid的值
t.join();
System.out.println(result.getUuid()+"============");
}
//模拟inputstream操作
public Stringinput(InputStream input) {
BufferedReaderreader = new BufferedReader(new InputStreamReader(input));
Stringline = null;
try{
while((line= reader.readLine()) != null) {
System.out.println("receivemessage = "+line);
}
reader.close();
returnUUID.randomUUID().toString();
}catch(Exceptione) {
e.printStackTrace();
}
returnnull;
}
private static classResult {
Stringuuid;
publicResult(String uuid) {
this.uuid= uuid;
}
publicResult() {}
publicString getUuid() {
returnuuid;
}
publicvoid setUuid(String uuid) {
this.uuid= uuid;
}
}
执行结果
Let it be了,也就那样吧
是以为记