Java @test注释在testNG中是如何工作的?
我对Java @test注释在testNG中是如何工作的?,java,testng,Java,Testng,我对@test注释的背景感到困惑。它是如何工作的?通过“for”循环?还是其他方法?我在git中找不到相关的源代码,有人能指出吗?TestNG中的@test注释将类或方法标记为测试的一部分。在以下链接中,您可以找到有关TestNG中@Test不同功能的更多信息: TestNG类是在TestNG框架中运行测试的入口点。 用户可以创建自己的TestNG对象,并以多种不同的方式调用它: 在现有的testng.xml上 在完全由Java创建的合成testng.xml上 通过直接设置测试类 TestNG首
@test
注释的背景感到困惑。它是如何工作的?通过“for”循环?还是其他方法?我在git中找不到相关的源代码,有人能指出吗?TestNG中的@test注释将类或方法标记为测试的一部分。在以下链接中,您可以找到有关TestNG中@Test不同功能的更多信息:
TestNG类是在TestNG框架中运行测试的入口点。 用户可以创建自己的TestNG对象,并以多种不同的方式调用它: 在现有的testng.xml上 在完全由Java创建的合成testng.xml上 通过直接设置测试类 TestNG首先创建TestNG.Class的对象,如下代码所示 /**默认构造函数。还设置默认侦听器/报告器的用法*/
public TestNG() {
init(true);
}
private void init(boolean useDefaultListeners) {
m_instance = this;
m_useDefaultListeners = useDefaultListeners;
m_configuration = new Configuration();
}
/**
- 设置此TestNG对象要运行的测试类。此方法将创建一个虚拟套件
- 这将封装这些类,称为“命令行测试”
- 如果与threadCount、parallel、groups、excludedGroups一起使用,则必须使用此选项
- 先定
- @param classes包含TestNG注释的类数组。 */ 公共void setTestClasses(类[]类){ m_suites.clear(); m_commandLineTestClasses=类; } ITestNGListener iTestListener=newtestnglistenerstest(); testng.addListener(iTestListener)
public void addListener(ITestNGListener listener) {
if (listener == null) {
return;
}
if (listener instanceof IExecutionVisualiser) {
IExecutionVisualiser visualiser = (IExecutionVisualiser) listener;
maybeAddListener(m_executionVisualisers, visualiser);
}
if (listener instanceof ISuiteListener) {
ISuiteListener suite = (ISuiteListener) listener;
maybeAddListener(m_suiteListeners, suite);
}
if (listener instanceof ITestListener) {
ITestListener test = (ITestListener) listener;
maybeAddListener(m_testListeners, test);
}
if (listener instanceof IClassListener) {
IClassListener clazz = (IClassListener) listener;
maybeAddListener(m_classListeners, clazz);
}
if (listener instanceof IReporter) {
IReporter reporter = (IReporter) listener;
maybeAddListener(m_reporters, reporter);
}
if (listener instanceof IAnnotationTransformer) {
setAnnotationTransformer((IAnnotationTransformer) listener);
}
if (listener instanceof IMethodInterceptor) {
m_methodInterceptors.add((IMethodInterceptor) listener);
}
if (listener instanceof IInvokedMethodListener) {
IInvokedMethodListener method = (IInvokedMethodListener) listener;
maybeAddListener(m_invokedMethodListeners, method);
}
if (listener instanceof IHookable) {
setHookable((IHookable) listener);
}
if (listener instanceof IConfigurable) {
setConfigurable((IConfigurable) listener);
}
if (listener instanceof IExecutionListener) {
m_configuration.addExecutionListenerIfAbsent((IExecutionListener) listener);
}
if (listener instanceof IConfigurationListener) {
m_configuration.addConfigurationListener((IConfigurationListener) listener);
}
if (listener instanceof IAlterSuiteListener) {
IAlterSuiteListener alter = (IAlterSuiteListener) listener;
maybeAddListener(m_alterSuiteListeners, alter);
}
if (listener instanceof IDataProviderListener) {
IDataProviderListener dataProvider = (IDataProviderListener) listener;
maybeAddListener(m_dataProviderListeners, dataProvider);
}
if (listener instanceof IDataProviderInterceptor) {
IDataProviderInterceptor interceptor = (IDataProviderInterceptor) listener;
maybeAddListener(m_dataProviderInterceptors, interceptor);
}
}
运行Testcases和测试套件的最后一个调用由run()方法执行。TestNG调用run方法,其中有多个对其他方法的调用,如sanityCheck()、runExecutionListeners()、List suiteRunners=runSuites();等等
/**运行TestNG*/
公开募捐{
初始化所有内容();
卫生检查();
runExecutionListeners(true/*start*/);
运行SuiteAlterationListeners();
m_start=System.currentTimeMillis();
列出suiteRunners=runSuites();
m_end=System.currentTimeMillis();
如果(空!=suiteRunners){
发电机报告(SuiteRunner);
}
runExecutionListeners(false/*finish*/);
exitCode=this.exitCodeListener.getStatus();
if(exitCodeListener.noTestsFound()){
if(TestRunner.getVerbose()>1){
System.err.println(“[TestNG]未找到任何测试。未运行任何测试”);
用法();
}
}
m_instance=null;
m_jCommander=null;
}
generateReports()方法也是run()方法的一个非常重要的方法调用,我想强调一下这一点,因为该方法收到一个ISuite接口列表,用于在套件运行结束时生成报告
private void generateReports(List<ISuite> suiteRunners) {
for (IReporter reporter : m_reporters.values()) {
try {
long start = System.currentTimeMillis();
reporter.generateReport(m_suites, suiteRunners, m_outputDir);
Utils.log(
"TestNG",
2,
"Time taken by " + reporter + ": " + (System.currentTimeMillis() - start) + " ms");
} catch (Exception ex) {
System.err.println("[TestNG] Reporter " + reporter + " failed");
ex.printStackTrace(System.err);
}
}
}
private void generatereport(列出SuiteRunner){
for(IReporter reporter:m_reporters.values()){
试一试{
长启动=System.currentTimeMillis();
reporter.generateReport(m_Suiters、suiteRunners、m_outputDir);
Utils.log(
“TestNG”,
2.
“+reporter+占用的时间:”+(System.currentTimeMillis()-start)+“ms”);
}捕获(例外情况除外){
System.err.println(“[TestNG]Reporter”+Reporter+”失败”);
例如printStackTrace(System.err);
}
}
}
谢谢你的回答,你可以看到重复的链接,但是上面的链接仍然不能解决我的问题,我想知道@Test的内部实现,而不是如何使用它
private void generateReports(List<ISuite> suiteRunners) {
for (IReporter reporter : m_reporters.values()) {
try {
long start = System.currentTimeMillis();
reporter.generateReport(m_suites, suiteRunners, m_outputDir);
Utils.log(
"TestNG",
2,
"Time taken by " + reporter + ": " + (System.currentTimeMillis() - start) + " ms");
} catch (Exception ex) {
System.err.println("[TestNG] Reporter " + reporter + " failed");
ex.printStackTrace(System.err);
}
}
}