LeanFT 和 Selenium 自定义自动化框架 - 未生成 HTML 报告
LeanFT & Selenium custom automation framework - no HTML report generated
我一直在尝试让 LeanFT html 报告与我的 Selenium/Junit 框架一起工作,但是到目前为止没有任何乐趣。
我在不同的论坛上多次搜索过这个话题,包括。惠普官方资料,尝试了所有我能找到的设置方法。
使用自定义 Selenium/LeanFT 框架时仍会生成 XML 运行结果文件。
我使用 JUnit 作为我的框架并使用 Selenium 作为 SDK 创建了一个 LeanFT 测试项目。我还添加了相关的 Selenium 罐子。
LeanFT 版本为 14.0.2816.0。
我意识到这个问题:https://community.softwaregrp.com/t5/UFT-Practitioners-Forum/HTML-report-not-generated-in-custom-framework-using-LeanFT/td-p/1614027 .
如果有人能解释我在这里犯错的地方或者软件版本是否是这里的问题,我将不胜感激。非常感谢任何帮助。
实际设置包含更多抽象,通常更复杂并且作为 jar 文件运行,但为了本主题的目的我简化了代码,因为两个设置的结果是相同的 - runresults.xml 没有 html:
测试Class:
import com.hp.lft.report.CaptureLevel;
import com.hp.lft.report.ModifiableReportConfiguration;
import com.hp.lft.report.Reporter;
import com.hp.lft.sdk.ModifiableSDKConfiguration;
import com.hp.lft.sdk.SDK;
import com.hp.lft.sdk.web.Browser;
import com.hp.lft.sdk.web.BrowserDescription;
import com.hp.lft.sdk.web.BrowserFactory;
import com.hp.lft.sdk.web.BrowserType;
import core.Selenium;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.*;
import java.io.File;
import java.net.URI;
public class SeleniumTest extends Selenium {
WebDriver driver;
Browser browser;
public SeleniumTest() {
//Change this constructor to private if you supply your own public constructor
}
@BeforeClass
public static void setUpBeforeClass() throws Exception {
instance = new SeleniumTest();
globalSetup(SeleniumTest.class);
}
@AfterClass
public static void tearDownAfterClass() throws Exception {
globalTearDown();
}
@Before
public void setUp() throws Exception {
ModifiableSDKConfiguration sdkConfig = new ModifiableSDKConfiguration();
sdkConfig.setServerAddress(new URI("ws://localhost:5095"));
SDK.init(sdkConfig);
ModifiableReportConfiguration reportConfig = new ModifiableReportConfiguration();
reportConfig.setOverrideExisting(true);
reportConfig.setTargetDirectory("C:\Users\user\IdeaProjects\LeanFT_Selenium\RunResults");
reportConfig.setReportFolder("LastRun");
reportConfig.setTitle("Summary");
reportConfig.setDescription("Description");
reportConfig.setSnapshotsLevel(CaptureLevel.All);
Reporter.init(reportConfig);
ChromeOptions options = new ChromeOptions();
options.addExtensions(new File
("C:\Program Files (x86)\HP\Unified Functional Testing\Installations\Chrome\Agent.crx"));
System.setProperty("webdriver.chrome.driver",
"C:\HP_Reporting\Webdriver\chromedriver.exe");
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability(ChromeOptions.CAPABILITY, options);
driver = new ChromeDriver(options);
browser = BrowserFactory.attach(new BrowserDescription.Builder()
.type(BrowserType.CHROME).build());
}
@After
public void tearDown() throws Exception {
driver.quit();
browser = null;
Reporter.generateReport();
SDK.cleanup();
}
@Test
public void test() throws Exception {
driver.get("https://www.google.co.uk/");
}
}
硒 Class:
import com.hp.lft.report.Status;
import com.hp.lft.unittesting.UnitTestBase;
import org.junit.After;
import org.junit.Before;
import org.junit.ClassRule;
import org.junit.Rule;
import org.junit.rules.TestWatcher;
public class Selenium extends UnitTestBase{
protected static Selenium instance;
public static void globalSetup(Class<? extends Selenium> testClass) throws Exception {
if (instance == null)
instance = testClass.newInstance();
instance.classSetup();
}
@Before
public void beforeTest() throws Exception {
testSetup();
}
@After
public void afterTest() throws Exception {
testTearDown();
}
public static void globalTearDown() throws Exception {
instance.classTearDown();
getReporter().generateReport();
}
@ClassRule
public static TestWatcher classWatcher = new TestWatcher() {
@Override
protected void starting(org.junit.runner.Description description) {
className = description.getClassName();
}
};
@Rule
public TestWatcher watcher = new TestWatcher() {
@Override
protected void starting(org.junit.runner.Description description) {
testName = description.getMethodName();
}
@Override
protected void failed(Throwable e, org.junit.runner.Description description) {
setStatus(Status.Failed);
}
@Override
protected void succeeded(org.junit.runner.Description description) {
setStatus(Status.Passed);
}
};
@Override
protected String getTestName() {
return testName;
}
@Override
protected String getClassName() {
return className;
}
protected static String className;
protected String testName;
}
Libraries
TL;DR
该报告仅在 14.00 中通过扩展 UnitTestBase
生成。要使用自定义自动化框架生成报告,您必须至少升级到 LeanFT 14.01(尽管在撰写本文时最新版本是 14.02)。
哦,澄清一下:这个问题与 Selenium 无关。例如,您在使用 NUnit 3 的 C# LeanFT SDK 中会有相同的行为。
详情
在此上下文中什么是自定义自动化框架?
当我说自定义自动化框架时,我指的是执行 SDK
和 Reporter
初始化和清理本身的任何框架。
LeanFT 通过其引擎发挥所有魔力。要告诉自定义框架连接到引擎,您需要执行以下步骤:
在测试套件的开头:
SDK.init();
Reporter.init(); // This is not for the engine, but for the HTML report generation
在测试套件结束时
Reporter.generateReport();
SDK.cleanup();
当您使用内置模板时,您会注意到 UnitTestClassBase
class 是自动创建的,它从 UnitTestBase
延伸并且您的 LeanFtTest
class 从这个 UnitTestClassBase
.
延伸
通过这样做,您将以非常具体的方式初始化 SDK
和 Reporter
,这就是为什么通过此初始化生成 HTML 报告的原因。如果您要在 custom 框架中重现这种特定方式,您还会生成 HTML 报告。如果你很好奇,你可以查看 UnitTestBase.class
文件的内容,看看它做了什么。
您正在从 UnitTestBase 扩展。为什么它不起作用?
正如我在评论中提到的,您实际上是在执行 SDK
和 Reporter
初始化两次,一次是通过扩展 UnitTestBase
(正如我上面所描述的那样,进行初始化已经)和第二次在你的 setUp
方法中。
由于您使用的是 LeanFT 14.00,因此您应该让 UnitTestBase
进行初始化、清理和报告生成。这意味着您的测试 Class 文件应该更改为不再包含 SDK
和 Reporter
的初始化,如下所示:
import com.hp.lft.report.CaptureLevel;
import com.hp.lft.report.ModifiableReportConfiguration;
import com.hp.lft.report.Reporter;
import com.hp.lft.sdk.ModifiableSDKConfiguration;
import com.hp.lft.sdk.SDK;
import com.hp.lft.sdk.web.Browser;
import com.hp.lft.sdk.web.BrowserDescription;
import com.hp.lft.sdk.web.BrowserFactory;
import com.hp.lft.sdk.web.BrowserType;
import core.Selenium;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.*;
import java.io.File;
import java.net.URI;
public class SeleniumTest extends Selenium {
WebDriver driver;
Browser browser;
public SeleniumTest() {
//Change this constructor to private if you supply your own public constructor
}
@BeforeClass
public static void setUpBeforeClass() throws Exception {
instance = new SeleniumTest();
globalSetup(SeleniumTest.class);
}
@AfterClass
public static void tearDownAfterClass() throws Exception {
globalTearDown();
}
@Before
public void setUp() throws Exception {
/*
This will not work in LeanFT 14.00, so we are commenting it out
ModifiableSDKConfiguration sdkConfig = new ModifiableSDKConfiguration();
sdkConfig.setServerAddress(new URI("ws://localhost:5095"));
SDK.init(sdkConfig);
ModifiableReportConfiguration reportConfig = new ModifiableReportConfiguration();
reportConfig.setOverrideExisting(true);
reportConfig.setTargetDirectory("C:\Users\user\IdeaProjects\LeanFT_Selenium\RunResults");
reportConfig.setReportFolder("LastRun");
reportConfig.setTitle("Summary");
reportConfig.setDescription("Description");
reportConfig.setSnapshotsLevel(CaptureLevel.All);
Reporter.init(reportConfig);
*/
ChromeOptions options = new ChromeOptions();
options.addExtensions(new File
("C:\Program Files (x86)\HP\Unified Functional Testing\Installations\Chrome\Agent.crx"));
System.setProperty("webdriver.chrome.driver",
"C:\HP_Reporting\Webdriver\chromedriver.exe");
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability(ChromeOptions.CAPABILITY, options);
driver = new ChromeDriver(options);
browser = BrowserFactory.attach(new BrowserDescription.Builder()
.type(BrowserType.CHROME).build());
}
@After
public void tearDown() throws Exception {
driver.quit();
browser = null;
//Reporter.generateReport();
//SDK.cleanup();
}
@Test
public void test() throws Exception {
driver.get("https://www.google.co.uk/");
}
}
但是我需要配置SDK和Report。我怎样才能在 LeanFT 14.00 中实现这一点?
SDK
和Reporter
可以通过两种方式配置:
- 在初始化时,您尝试通过
ModifiableSDKConfiguration
和 ModifiableReportConfiguration
或
- 在测试设置文件中 (
resources/leanft.properties
)。可以看到plenty details in the official help.
您也可以通过 Reporter
API:
在运行时操作 某些 报告设置
- 设置报告级别:
Reporter.setReportLevel(ReportLevel.All);
- 设置快照捕获级别
Reporter.setSnapshotCaptureLevel(CaptureLevel.All);
- 即使您通过基础 class 初始化了
SDK
和 Reporter
,您仍然可以在报告中添加自定义报告事件(这些工作:Reporter.reportEvent();
, Reporter.startReportingContext();
, Reporter.startTest();
, 等等)
我一直在尝试让 LeanFT html 报告与我的 Selenium/Junit 框架一起工作,但是到目前为止没有任何乐趣。 我在不同的论坛上多次搜索过这个话题,包括。惠普官方资料,尝试了所有我能找到的设置方法。 使用自定义 Selenium/LeanFT 框架时仍会生成 XML 运行结果文件。
我使用 JUnit 作为我的框架并使用 Selenium 作为 SDK 创建了一个 LeanFT 测试项目。我还添加了相关的 Selenium 罐子。
LeanFT 版本为 14.0.2816.0。 我意识到这个问题:https://community.softwaregrp.com/t5/UFT-Practitioners-Forum/HTML-report-not-generated-in-custom-framework-using-LeanFT/td-p/1614027 .
如果有人能解释我在这里犯错的地方或者软件版本是否是这里的问题,我将不胜感激。非常感谢任何帮助。
实际设置包含更多抽象,通常更复杂并且作为 jar 文件运行,但为了本主题的目的我简化了代码,因为两个设置的结果是相同的 - runresults.xml 没有 html:
测试Class:
import com.hp.lft.report.CaptureLevel; import com.hp.lft.report.ModifiableReportConfiguration; import com.hp.lft.report.Reporter; import com.hp.lft.sdk.ModifiableSDKConfiguration; import com.hp.lft.sdk.SDK; import com.hp.lft.sdk.web.Browser; import com.hp.lft.sdk.web.BrowserDescription; import com.hp.lft.sdk.web.BrowserFactory; import com.hp.lft.sdk.web.BrowserType; import core.Selenium; import org.junit.After; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.chrome.ChromeOptions; import org.openqa.selenium.remote.DesiredCapabilities; import org.openqa.selenium.*; import java.io.File; import java.net.URI; public class SeleniumTest extends Selenium { WebDriver driver; Browser browser; public SeleniumTest() { //Change this constructor to private if you supply your own public constructor } @BeforeClass public static void setUpBeforeClass() throws Exception { instance = new SeleniumTest(); globalSetup(SeleniumTest.class); } @AfterClass public static void tearDownAfterClass() throws Exception { globalTearDown(); } @Before public void setUp() throws Exception { ModifiableSDKConfiguration sdkConfig = new ModifiableSDKConfiguration(); sdkConfig.setServerAddress(new URI("ws://localhost:5095")); SDK.init(sdkConfig); ModifiableReportConfiguration reportConfig = new ModifiableReportConfiguration(); reportConfig.setOverrideExisting(true); reportConfig.setTargetDirectory("C:\Users\user\IdeaProjects\LeanFT_Selenium\RunResults"); reportConfig.setReportFolder("LastRun"); reportConfig.setTitle("Summary"); reportConfig.setDescription("Description"); reportConfig.setSnapshotsLevel(CaptureLevel.All); Reporter.init(reportConfig); ChromeOptions options = new ChromeOptions(); options.addExtensions(new File ("C:\Program Files (x86)\HP\Unified Functional Testing\Installations\Chrome\Agent.crx")); System.setProperty("webdriver.chrome.driver", "C:\HP_Reporting\Webdriver\chromedriver.exe"); DesiredCapabilities capabilities = new DesiredCapabilities(); capabilities.setCapability(ChromeOptions.CAPABILITY, options); driver = new ChromeDriver(options); browser = BrowserFactory.attach(new BrowserDescription.Builder() .type(BrowserType.CHROME).build()); } @After public void tearDown() throws Exception { driver.quit(); browser = null; Reporter.generateReport(); SDK.cleanup(); } @Test public void test() throws Exception { driver.get("https://www.google.co.uk/"); } }
硒 Class:
import com.hp.lft.report.Status; import com.hp.lft.unittesting.UnitTestBase; import org.junit.After; import org.junit.Before; import org.junit.ClassRule; import org.junit.Rule; import org.junit.rules.TestWatcher; public class Selenium extends UnitTestBase{ protected static Selenium instance; public static void globalSetup(Class<? extends Selenium> testClass) throws Exception { if (instance == null) instance = testClass.newInstance(); instance.classSetup(); } @Before public void beforeTest() throws Exception { testSetup(); } @After public void afterTest() throws Exception { testTearDown(); } public static void globalTearDown() throws Exception { instance.classTearDown(); getReporter().generateReport(); } @ClassRule public static TestWatcher classWatcher = new TestWatcher() { @Override protected void starting(org.junit.runner.Description description) { className = description.getClassName(); } }; @Rule public TestWatcher watcher = new TestWatcher() { @Override protected void starting(org.junit.runner.Description description) { testName = description.getMethodName(); } @Override protected void failed(Throwable e, org.junit.runner.Description description) { setStatus(Status.Failed); } @Override protected void succeeded(org.junit.runner.Description description) { setStatus(Status.Passed); } }; @Override protected String getTestName() { return testName; } @Override protected String getClassName() { return className; } protected static String className; protected String testName; }
Libraries
TL;DR
该报告仅在 14.00 中通过扩展 UnitTestBase
生成。要使用自定义自动化框架生成报告,您必须至少升级到 LeanFT 14.01(尽管在撰写本文时最新版本是 14.02)。
哦,澄清一下:这个问题与 Selenium 无关。例如,您在使用 NUnit 3 的 C# LeanFT SDK 中会有相同的行为。
详情
在此上下文中什么是自定义自动化框架?
当我说自定义自动化框架时,我指的是执行 SDK
和 Reporter
初始化和清理本身的任何框架。
LeanFT 通过其引擎发挥所有魔力。要告诉自定义框架连接到引擎,您需要执行以下步骤:
在测试套件的开头:
SDK.init(); Reporter.init(); // This is not for the engine, but for the HTML report generation
在测试套件结束时
Reporter.generateReport(); SDK.cleanup();
当您使用内置模板时,您会注意到 UnitTestClassBase
class 是自动创建的,它从 UnitTestBase
延伸并且您的 LeanFtTest
class 从这个 UnitTestClassBase
.
通过这样做,您将以非常具体的方式初始化 SDK
和 Reporter
,这就是为什么通过此初始化生成 HTML 报告的原因。如果您要在 custom 框架中重现这种特定方式,您还会生成 HTML 报告。如果你很好奇,你可以查看 UnitTestBase.class
文件的内容,看看它做了什么。
您正在从 UnitTestBase 扩展。为什么它不起作用?
正如我在评论中提到的,您实际上是在执行 SDK
和 Reporter
初始化两次,一次是通过扩展 UnitTestBase
(正如我上面所描述的那样,进行初始化已经)和第二次在你的 setUp
方法中。
由于您使用的是 LeanFT 14.00,因此您应该让 UnitTestBase
进行初始化、清理和报告生成。这意味着您的测试 Class 文件应该更改为不再包含 SDK
和 Reporter
的初始化,如下所示:
import com.hp.lft.report.CaptureLevel;
import com.hp.lft.report.ModifiableReportConfiguration;
import com.hp.lft.report.Reporter;
import com.hp.lft.sdk.ModifiableSDKConfiguration;
import com.hp.lft.sdk.SDK;
import com.hp.lft.sdk.web.Browser;
import com.hp.lft.sdk.web.BrowserDescription;
import com.hp.lft.sdk.web.BrowserFactory;
import com.hp.lft.sdk.web.BrowserType;
import core.Selenium;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.*;
import java.io.File;
import java.net.URI;
public class SeleniumTest extends Selenium {
WebDriver driver;
Browser browser;
public SeleniumTest() {
//Change this constructor to private if you supply your own public constructor
}
@BeforeClass
public static void setUpBeforeClass() throws Exception {
instance = new SeleniumTest();
globalSetup(SeleniumTest.class);
}
@AfterClass
public static void tearDownAfterClass() throws Exception {
globalTearDown();
}
@Before
public void setUp() throws Exception {
/*
This will not work in LeanFT 14.00, so we are commenting it out
ModifiableSDKConfiguration sdkConfig = new ModifiableSDKConfiguration();
sdkConfig.setServerAddress(new URI("ws://localhost:5095"));
SDK.init(sdkConfig);
ModifiableReportConfiguration reportConfig = new ModifiableReportConfiguration();
reportConfig.setOverrideExisting(true);
reportConfig.setTargetDirectory("C:\Users\user\IdeaProjects\LeanFT_Selenium\RunResults");
reportConfig.setReportFolder("LastRun");
reportConfig.setTitle("Summary");
reportConfig.setDescription("Description");
reportConfig.setSnapshotsLevel(CaptureLevel.All);
Reporter.init(reportConfig);
*/
ChromeOptions options = new ChromeOptions();
options.addExtensions(new File
("C:\Program Files (x86)\HP\Unified Functional Testing\Installations\Chrome\Agent.crx"));
System.setProperty("webdriver.chrome.driver",
"C:\HP_Reporting\Webdriver\chromedriver.exe");
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability(ChromeOptions.CAPABILITY, options);
driver = new ChromeDriver(options);
browser = BrowserFactory.attach(new BrowserDescription.Builder()
.type(BrowserType.CHROME).build());
}
@After
public void tearDown() throws Exception {
driver.quit();
browser = null;
//Reporter.generateReport();
//SDK.cleanup();
}
@Test
public void test() throws Exception {
driver.get("https://www.google.co.uk/");
}
}
但是我需要配置SDK和Report。我怎样才能在 LeanFT 14.00 中实现这一点?
SDK
和Reporter
可以通过两种方式配置:
- 在初始化时,您尝试通过
ModifiableSDKConfiguration
和ModifiableReportConfiguration
或
- 在测试设置文件中 (
resources/leanft.properties
)。可以看到plenty details in the official help.
您也可以通过 Reporter
API:
- 设置报告级别:
Reporter.setReportLevel(ReportLevel.All);
- 设置快照捕获级别
Reporter.setSnapshotCaptureLevel(CaptureLevel.All);
- 即使您通过基础 class 初始化了
SDK
和Reporter
,您仍然可以在报告中添加自定义报告事件(这些工作:Reporter.reportEvent();
,Reporter.startReportingContext();
,Reporter.startTest();
, 等等)