测试1:
@Path("/performance")
public class PerformanceTestResource {
@Timeout(20000)
@GET
@Path("/resource")
@Produces(MediaType.APPLICATION_JSON)
public Response performanceResource() {
final String name = Thread.currentThread().getName();
System.out.println(name);
Single<Data> dataSingle = null;
try {
dataSingle = Single.fromCallable(() -> {
final String name2 = Thread.currentThread().getName();
System.out.println(name2);
Thread.sleep(1000);
return new Data();
}).subscribeOn(Schedulers.io());
} catch (Exception ex) {
int a = 1;
}
return Response.ok().entity(dataSingle.blockingGet()).build();
}
}
测试本身也可以看到call定期
定义:
@QuarkusTest
public class PerformanceTestResourceTest {
@Tag("load-test")
@Test
public void loadTest() throws InterruptedException {
int CALL_N_TIMES = 1000;
final long CALL_NIT_EVERY_MILLISECONDS = 10;
final LoadTestMetricsData loadTestMetricsData = LoadTestUtils.callPeriodically(
this::callHttpEndpoint,
CALL_N_TIMES,
CALL_NIT_EVERY_MILLISECONDS
);
assertThat(loadTestMetricsData.responseList.size(), CoreMatchers.is(equalTo(Long.valueOf(CALL_N_TIMES).intValue())));
long executionTime = loadTestMetricsData.duration.getSeconds();
System.out.println("executionTime: " + executionTime + " seconds");
assertThat(executionTime , allOf(greaterThanOrEqualTo(1L),lessThan(20L)));
}
测试1的结果:
执行时间:16秒
测试2:相同,但没有@Timeout注释:
执行时间:65秒
问:为什么?我认为即使16秒也很慢。问:如何让它更快:说1000个电话要2秒。
我意识到我使用<代码>。资源中的blockingGet(),但我仍然希望重用阻塞线程。
P、 我尝试了更多的“反应式”返回<code>Single
更新:反应式/RX 爪哇 2 路
@path("/performance")
public class PerformanceTestResource {
//@Timeout(20000)
@GET
@Path("/resource")
@Produces(MediaType.APPLICATION_JSON)
public Single<Data> performanceResource() {
final String name = Thread.currentThread().getName();
System.out.println(name);
System.out.println("name: " + name);
return Single.fromCallable(() -> {
final String name2 = Thread.currentThread().getName();
System.out.println("name2: " + name2);
Thread.sleep(1000);
return new Data();
});
}
}`
砰.xml:
io . small rye small rye-context-propagation-propagators-rx Java 2 org . JBoss . rest easy rest easy-rx Java 2
然后,当运行相同的测试时:
执行时间:64秒
输出将类似于:
name: vert.x-worker-thread-5 vert.x-worker-thread-9 name: vert.x-worker-thread-9
name2: vert.x-worker-thread-9
name2: vert.x-worker-thread-5
因此,我们阻止了工作线程,即在 REst/资源端使用。那是高速公路。然后:
如果我使用:Schedulers.io()
在睡眠-1000-call的单独执行上下文中:
return Single.fromCallable(() -> { ... }).subscribeOn(Schedulers.io());
执行时间:16秒
输出将是这样的(见一个新成员:RxCachedThreadScheduler)
name: vert.x-worker-thread-5
name2: RxCachedThreadScheduler-1683
vert.x-worker-thread-0
name: vert.x-worker-thread-0
vert.x-worker-thread-9
name: vert.x-worker-thread-9
name2: RxCachedThreadScheduler-1658
vert.x-worker-thread-8
似乎无关紧要:无论我是否显式使用block ingGet()
,我都得到相同的结果。
我想,如果我不阻止它,这将是大约2-3秒。
问:从现在开始,我有办法修正/调整这个问题吗?
我假设使用<code>调度程序。io()带来了<code>RxCachedThreadScheduler
问:或者无论如何:如何使应用程序像Quarkus一样具有响应性/反应性/性能。或者我错过了什么?
谢谢!
好的。也许是我。在我的call periodicly();我传递CALL_NIT_EVERY_MILLISECONDS = 10毫秒。10 * 1000 = 10 000 -仅添加请求就需要10秒。
这个,我设置成0了
我得到了服务器1000模拟请求的6秒。
还是不是2-3秒。而是6秒。
如果我使用. getBlock
并返回响应
或返回单
,似乎没有区别。
--
但只是提一下,这个hello world应用程序需要1秒钟来处理1000个并行请求。而Quarkus一号是6秒。
public class Sample2 {
static final AtomicInteger atomicInteger = new AtomicInteger(0);
public static void main(String[] args) {
long start = System.currentTimeMillis();
final List<Single<Response>> listOfSingles = Collections.synchronizedList(new ArrayList<>());
for (int i=0; i< 1000; i++) {
// try {
// Thread.sleep(10);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
final Single<Response> responseSingle = longCallFunction();
listOfSingles.add(responseSingle);
}
Single<Response> last = Single.merge(listOfSingles).lastElement().toSingle();
final Response response = last.blockingGet();
long end = System.currentTimeMillis();
System.out.println("Execution time: " + (end - start) / 1000);
System.out.println(response);
}
static Single<Response> longCallFunction() {
return Single.fromCallable( () -> { // 1 sec
System.out.println(Thread.currentThread().getName());
Thread.sleep(1000);
int code = atomicInteger.incrementAndGet();
//System.out.println(code);
return new Response(code);
}).subscribeOn(Schedulers.io());
}
}
还是需要更改Apache设置?
我已经使用JMeter为我的web应用程序创建了一个记录的测试计划。我的web应用程序基本上为新客户和现有客户创建一个财务计划。我记录了为一个新客户创建财务计划所需的所有步骤。我不确定如何验证Jmeter是否真的运行了记录的步骤。我正在使用图形结果,并在记录计划的末尾检查吞吐量。 我不确定如何验证Jmeter是否实际运行了所有线程用户和记录的步骤。如有任何建议,将不胜感激。谢谢!
对于任何使用jmeter进行api功能测试的人来说,报告并不是很好。有人使用http://extentreports.com/这样的东西来显示他们的测试结果吗?对其他更好地显示测试结果的方法有什么想法吗?在尝试使用一个主要关注性能测试和测试结果的工具时,当我们测试REST API调用和测试结果时,这并不起作用。例如,能够捕获在测试运行期间创建的数据是很好的,但是jmeter中内置的报告都没有做到这
我如何负载测试一个同时有300个用户使用jmeter的登录页面(而不是一个又一个用户。同时有300个用户登录)?线程组的设置应该是什么?
我正在使用ITestListener,用于生成范围报告的范围管理器。它工作正常。我正在从另一个方法调用5@Test方法。报告(TestNG 请检查我的示例代码:建议任何其他方法来获得报告 我的TestNG XML文件: 我的驱动程序脚本:
主要内容:1. 项目依赖文件配置,2. @Test(invocationCount =?),3. @Test(invocationCount = ? threadPoolSize = ?),4. 负载测试示例在本教程中,我们将演示如何使用属性和在网站上执行负载测试或压力测试。 使用的工具 : TestNG 6.8.7 Selenium 2.39.0 Maven 3 我们使用库自动化浏览器来访问网站。创建一个用于测试的Maven项目:TestngSelenium 。 1. 项目依赖文件配置 获取T