首页 > 解决方案 > 使用 Selenium 和 TestNG 在 IntelliJ 中运行测试时“未找到测试”

问题描述

我刚刚开始编写自动化测试。这是我的第一个项目,我无法解决这个问题。我创建了一个 TestBase 类和两个类扩展它。第一类 (LessonCreationTests) 中的测试确实运行(它们失败,但这是一个不同的问题),但在第二类 (LessonDeletionTests) 中运行测试返回“未找到测试”。

我尝试将 IJ 设置“构建并运行”和“运行测试”从 Gradle 更改为 IJ,但没有帮助。

版本:

测试NG 7.1.0

IJ 社区 2020.1.2

这是我的 TestBase 类:

package ld_tests;

import org.openqa.selenium.By;
import org.openqa.selenium.NoAlertPresentException;
import org.openqa.selenium.NoSuchElementException;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;

import java.util.concurrent.TimeUnit;

public class TestBase {
  protected WebDriver driver;

  @BeforeMethod(alwaysRun = true)
  public void setUp() throws Exception {
    driver = new ChromeDriver();
    driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
    driver.get("xxxxxxxxxxxxxxx");
    login("xxxx", "xxxx");
  }

  @AfterMethod(alwaysRun = true)
  public void tearDown() throws Exception {
    driver.quit();
  }

  protected void login(String username, String password) {
    driver.findElement(By.name("username")).click();
    driver.findElement(By.name("username")).clear();
    driver.findElement(By.name("username")).sendKeys(username);
    driver.findElement(By.name("password")).clear();
    driver.findElement(By.name("password")).sendKeys(password);
    driver.findElement(By.xpath("//button[contains(text(),'Log in')]")).click();
  }

我的 LessonDeletionTests 课程:

package ld_tests;

import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.interactions.Actions;
import org.testng.Assert;
import org.testng.annotations.Test;

public class LessonDeletionTests extends ld_tests.TestBase {

  @Test
  public void testLessonDeletion() throws Exception {
    int before = getLessonCount();
    deleteLesson();
    int after = getLessonCount();
    Assert.assertEquals(after, before -1);
  }

  private void deleteLesson() {
    Actions action = new Actions(driver);
    action.moveToElement(lessonRow).perform();
    action.moveToElement(deleteButton).click().perform();
  }

  WebElement deleteButton = driver.findElement(By.xpath("//tr[2]//td[7]//a[3]"));
  WebElement lessonRow =  driver.findElement(By.className("lessonTableRow"));

  private int getLessonCount() {
    return driver.findElements(By.className("lessonTableRow")).size();
  }
}

我的 build.gradle:

apply plugin: 'java'

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.testng:testng:7.1.0'
    implementation 'org.seleniumhq.selenium:selenium-java:4.0.0-alpha-5'
    implementation 'org.hamcrest:hamcrest:2.2'
    implementation 'com.beust:jcommander:1.78'
    implementation 'com.thoughtworks.xstream:xstream:1.4.11.1'
    implementation 'com.google.code.gson:gson:2.8.6'
    implementation 'ch.qos.logback:logback-classic:1.3.0-alpha5'
}

test {
    useTestNG()
}

这就是我得到的:

/Library/Java/JavaVirtualMachines/jdk-13.0.2.jdk/Contents/Home/bin/java -ea -Didea.test.cyclic.buffer.size=1048576 -javaagent:/Applications/IntelliJ IDEA CE.app/Contents/lib/idea_rt.jar=62535:/Applications/IntelliJ IDEA CE.app/Contents/bin -Dfile.encoding=UTF-8 -classpath /Applications/IntelliJ IDEA CE.app/Contents/lib/idea_rt.jar:/Applications/IntelliJ IDEA CE.app/Contents/plugins/testng/lib/testng-rt.jar:/Users/nlee/Devel/GitHub/CPaT/lesson_designer/out/test/classes:/Users/nlee/.gradle/caches/modules-2/files-2.1/org.testng/testng/7.1.0/b0bcea778fb2899aeb4014c558babea8833d180a/testng-7.1.0.jar:/Users/nlee/.gradle/caches/modules-2/files-2.1/org.seleniumhq.selenium/selenium-java/4.0.0-alpha-5/ac67ee553c8336a4cf4d0b46cd05437ee90326ae/selenium-java-4.0.0-alpha-5.jar:/Users/nlee/.gradle/caches/modules-2/files-2.1/org.hamcrest/hamcrest/2.2/1820c0968dba3a11a1b30669bb1f01978a91dedc/hamcrest-2.2.jar:/Users/nlee/.gradle/caches/modules-2/files-2.1/com.beust/jcommander/1.78/a3927de9bd6f351429bcf763712c9890629d8f51/jcommander-1.78.jar:/Users/nlee/.gradle/caches/modules-2/files-2.1/com.thoughtworks.xstream/xstream/1.4.11.1/6c120c45a8c480bb2fea5b56502e3993ddd74fd2/xstream-1.4.11.1.jar:/Users/nlee/.gradle/caches/modules-2/files-2.1/com.google.code.gson/gson/2.8.6/9180733b7df8542621dc12e21e87557e8c99b8cb/gson-2.8.6.jar:/Users/nlee/.gradle/caches/modules-2/files-2.1/ch.qos.logback/logback-classic/1.3.0-alpha5/3195156aa3b62b2f4407a7841700f2759bebf192/logback-classic-1.3.0-alpha5.jar:/Users/nlee/.gradle/caches/modules-2/files-2.1/com.google.inject/guice/4.1.0/faf9ee8ac09eafd1128091426dd367a8c0085d55/guice-4.1.0-no_aop.jar:/Users/nlee/.gradle/caches/modules-2/files-2.1/org.yaml/snakeyaml/1.21/18775fdda48574784f40b47bf478ab0593f92e4d/snakeyaml-1.21.jar:/Users/nlee/.gradle/caches/modules-2/files-2.1/org.seleniumhq.selenium/selenium-support/4.0.0-alpha-5/c8dae99b82f3b6527c1263cd841ec82e626d0e80/selenium-support-4.0.0-alpha-5.jar:/Users/nlee/.gradle/caches/modules-2/files-2.1/org.seleniumhq.selenium/selenium-chrome-driver/4.0.0-alpha-5/daa1b59b8c40bc531ab3749432840a0acda61b10/selenium-chrome-driver-4.0.0-alpha-5.jar:/Users/nlee/.gradle/caches/modules-2/files-2.1/org.seleniumhq.selenium/selenium-edgehtml-driver/4.0.0-alpha-5/2fb9ccf7c0e3ead11427bbb3f38959f589dc5f44/selenium-edgehtml-driver-4.0.0-alpha-5.jar:/Users/nlee/.gradle/caches/modules-2/files-2.1/org.seleniumhq.selenium/selenium-edge-driver/4.0.0-alpha-5/eb91d6b5fba23d3d749b83bb59817407d0ffc061/selenium-edge-driver-4.0.0-alpha-5.jar:/Users/nlee/.gradle/caches/modules-2/files-2.1/org.seleniumhq.selenium/selenium-firefox-xpi-driver/4.0.0-alpha-5/a1c24c9a1fe89144acdb4207a89d6ff4e6242974/selenium-firefox-xpi-driver-4.0.0-alpha-5.jar:/Users/nlee/.gradle/caches/modules-2/files-2.1/org.seleniumhq.selenium/selenium-ie-driver/4.0.0-alpha-5/740d7da9c3196a51cd12ed90bf2bc2a279972fbf/selenium-ie-driver-4.0.0-alpha-5.jar:/Users/nlee/.gradle/caches/modules-2/files-2.1/org.seleniumhq.selenium/selenium-opera-driver/4.0.0-alpha-5/19bc9f49b1416da1c03ffd9474a2d08b152cab3d/selenium-opera-driver-4.0.0-alpha-5.jar:/Users/nlee/.gradle/caches/modules-2/files-2.1/org.seleniumhq.selenium/selenium-firefox-driver/4.0.0-alpha-5/4eec5c474bc11f45de9cb5940062e73f8ecb1f66/selenium-firefox-driver-4.0.0-alpha-5.jar:/Users/nlee/.gradle/caches/modules-2/files-2.1/org.seleniumhq.selenium/selenium-safari-driver/4.0.0-alpha-5/8027ff95d39e97e3da9cdc41804708d0f14c7fbd/selenium-safari-driver-4.0.0-alpha-5.jar:/Users/nlee/.gradle/caches/modules-2/files-2.1/org.seleniumhq.selenium/selenium-remote-driver/4.0.0-alpha-5/12f6fe98820fc577781fb82e50a23facbc7230e3/selenium-remote-driver-4.0.0-alpha-5.jar:/Users/nlee/.gradle/caches/modules-2/files-2.1/org.seleniumhq.selenium/selenium-api/4.0.0-alpha-5/335103f509ca11959c8177b38892a34d1570b45c/selenium-api-4.0.0-alpha-5.jar:/Users/nlee/.gradle/caches/modules-2/files-2.1/xmlpull/xmlpull/1.1.3.1/2b8e230d2ab644e4ecaa94db7cdedbc40c805dfa/xmlpull-1.1.3.1.jar:/Users/nlee/.gradle/caches/modules-2/files-2.1/xpp3/xpp3_min/1.1.4c/19d4e90b43059058f6e056f794f0ea4030d60b86/xpp3_min-1.1.4c.jar:/Users/nlee/.gradle/caches/modules-2/files-2.1/ch.qos.logback/logback-core/1.3.0-alpha5/4f3163d95c96b7be69d9e5245573834fd130a4bb/logback-core-1.3.0-alpha5.jar:/Users/nlee/.gradle/caches/modules-2/files-2.1/org.slf4j/slf4j-api/2.0.0-alpha1/e979781e847d44d3618c4479d438956593b6b080/slf4j-api-2.0.0-alpha1.jar:/Users/nlee/.gradle/caches/modules-2/files-2.1/edu.washington.cs.types.checker/checker-framework/1.7.0/f652eb570f82dea2f7718c23f81b759c0c8e5ccf/checker-framework-1.7.0.jar:/Users/nlee/.gradle/caches/modules-2/files-2.1/javax.inject/javax.inject/1/6975da39a7040257bd51d21a231b76c915872d38/javax.inject-1.jar:/Users/nlee/.gradle/caches/modules-2/files-2.1/aopalliance/aopalliance/1.0/235ba8b489512805ac13a8f9ea77a1ca5ebe3e8/aopalliance-1.0.jar:/Users/nlee/.gradle/caches/modules-2/files-2.1/com.google.guava/guava/28.2-jre/8ec9ed76528425762174f0011ce8f74ad845b756/guava-28.2-jre.jar:/Users/nlee/.gradle/caches/modules-2/files-2.1/org.seleniumhq.selenium/selenium-devtools/4.0.0-alpha-5/927f5641734b91e2733130f1c532bc4a296e5054/selenium-devtools-4.0.0-alpha-5.jar:/Users/nlee/.gradle/caches/modules-2/files-2.1/org.seleniumhq.selenium/selenium-json/4.0.0-alpha-5/108844b85e7db0c27489d0f0df871d16a7fbdaf3/selenium-json-4.0.0-alpha-5.jar:/Users/nlee/.gradle/caches/modules-2/files-2.1/org.seleniumhq.selenium/selenium-chromium-driver/4.0.0-alpha-5/1e14e119d55738c8ff8c64c0a5d30028a8837704/selenium-chromium-driver-4.0.0-alpha-5.jar:/Users/nlee/.gradle/caches/modules-2/files-2.1/org.seleniumhq.selenium/selenium-http/4.0.0-alpha-5/c33eabf4efdd28575b7e8c8779e6ef11e09eba95/selenium-http-4.0.0-alpha-5.jar:/Users/nlee/.gradle/caches/modules-2/files-2.1/com.google.auto.service/auto-service/1.0-rc6/4586e4191111b24135ffac93d3e1a91e91bf71d3/auto-service-1.0-rc6.jar:/Users/nlee/.gradle/caches/modules-2/files-2.1/com.google.auto.service/auto-service-annotations/1.0-rc6/32c6a6313217c949396376d9caddb6b8c8f4e7c3/auto-service-annotations-1.0-rc6.jar:/Users/nlee/.gradle/caches/modules-2/files-2.1/org.asynchttpclient/async-http-client/2.11.0/340374c31445de14c3010740ce165eb332ee5db8/async-http-client-2.11.0.jar:/Users/nlee/.gradle/caches/modules-2/files-2.1/com.squareup.okhttp3/okhttp/4.4.1/d2e71a032b1927539c07adc3a9f36336d6fbf4b9/okhttp-4.4.1.jar:/Users/nlee/.gradle/caches/modules-2/files-2.1/com.squareup.okio/okio/2.4.3/d946f785445d73c6bc99bbd778576d2576e37ea9/okio-jvm-2.4.3.jar:/Users/nlee/.gradle/caches/modules-2/files-2.1/com.typesafe.netty/netty-reactive-streams/2.0.4/f77c8eaa7d5e2f2160b6d21ba385cf726f164b2/netty-reactive-streams-2.0.4.jar:/Users/nlee/.gradle/caches/modules-2/files-2.1/io.netty/netty-codec-http/4.1.47.Final/5770690a06382c8618eec8764e33b3d6621f30c0/netty-codec-http-4.1.47.Final.jar:/Users/nlee/.gradle/caches/modules-2/files-2.1/io.netty/netty-transport-native-epoll/4.1.47.Final/e6962548e57ca315bc66749bb4964571ee1d605c/netty-transport-native-epoll-4.1.47.Final.jar:/Users/nlee/.gradle/caches/modules-2/files-2.1/io.netty/netty-transport-native-epoll/4.1.47.Final/e860e2a854f0eea282000f70de00e7d5c4e1d385/netty-transport-native-epoll-4.1.47.Final-linux-x86_64.jar:/Users/nlee/.gradle/caches/modules-2/files-2.1/io.netty/netty-transport-native-kqueue/4.1.47.Final/cddd2bc78254fdabf05dba383ed1ae6b2fcbbeea/netty-transport-native-kqueue-4.1.47.Final.jar:/Users/nlee/.gradle/caches/modules-2/files-2.1/io.netty/netty-transport-native-kqueue/4.1.47.Final/46bb091ba09000714c82bfd36f18395f91e783c1/netty-transport-native-kqueue-4.1.47.Final-osx-x86_64.jar:/Users/nlee/.gradle/caches/modules-2/files-2.1/io.netty/netty-transport-native-unix-common/4.1.47.Final/711ba6202031d2296907bb82b15b42d5034ed029/netty-transport-native-unix-common-4.1.47.Final.jar:/Users/nlee/.gradle/caches/modules-2/files-2.1/io.netty/netty-transport/4.1.47.Final/8c2a50ad0b025bd735b865e678b8c4b12121d941/netty-transport-4.1.47.Final.jar:/Users/nlee/.gradle/caches/modules-2/files-2.1/io.netty/netty-buffer/4.1.47.Final/4aa485d17af675649f8f43aee3b0d1719b00e4ec/netty-buffer-4.1.47.Final.jar:/Users/nlee/.gradle/caches/modules-2/files-2.1/io.opentelemetry/opentelemetry-api/0.2.0/2d98a210739ae18e035a7ea1ee58aa9499aebfd9/opentelemetry-api-0.2.0.jar:/Users/nlee/.gradle/caches/modules-2/files-2.1/net.bytebuddy/byte-buddy/1.10.8/df457a421493f9de0acb16c4c4c0a62e8f5dd3a3/byte-buddy-1.10.8.jar:/Users/nlee/.gradle/caches/modules-2/files-2.1/org.apache.commons/commons-exec/1.3/8dfb9facd0830a27b1b5f29f84593f0aeee7773b/commons-exec-1.3.jar:/Users/nlee/.gradle/caches/modules-2/files-2.1/com.google.guava/failureaccess/1.0.1/1dcf1de382a0bf95a3d8b0849546c88bac1292c9/failureaccess-1.0.1.jar:/Users/nlee/.gradle/caches/modules-2/files-2.1/com.google.guava/listenablefuture/9999.0-empty-to-avoid-conflict-with-guava/b421526c5f297295adef1c886e5246c39d4ac629/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar:/Users/nlee/.gradle/caches/modules-2/files-2.1/com.google.code.findbugs/jsr305/3.0.2/25ea2e8b0c338a877313bd4672d3fe056ea78f0d/jsr305-3.0.2.jar:/Users/nlee/.gradle/caches/modules-2/files-2.1/org.checkerframework/checker-qual/2.10.0/5786699a0cb71f9dc32e6cca1d665eef07a0882f/checker-qual-2.10.0.jar:/Users/nlee/.gradle/caches/modules-2/files-2.1/com.google.errorprone/error_prone_annotations/2.3.4/dac170e4594de319655ffb62f41cbd6dbb5e601e/error_prone_annotations-2.3.4.jar:/Users/nlee/.gradle/caches/modules-2/files-2.1/com.google.j2objc/j2objc-annotations/1.3/ba035118bc8bac37d7eff77700720999acd9986d/j2objc-annotations-1.3.jar:/Users/nlee/.gradle/caches/modules-2/files-2.1/com.google.auto/auto-common/0.10/c8f153ebe04a17183480ab4016098055fb474364/auto-common-0.10.jar:/Users/nlee/.gradle/caches/modules-2/files-2.1/org.asynchttpclient/async-http-client-netty-utils/2.11.0/8533aa84a2f01eea313689dcb604da0834be00b0/async-http-client-netty-utils-2.11.0.jar:/Users/nlee/.gradle/caches/modules-2/files-2.1/io.netty/netty-handler-proxy/4.1.46.Final/d7161f586651e01df6dfc3bf2d8bb50400bb98d0/netty-handler-proxy-4.1.46.Final.jar:/Users/nlee/.gradle/caches/modules-2/files-2.1/io.netty/netty-handler/4.1.47.Final/21db930f1964dabb103b2553fe4cfb79a56a36d8/netty-handler-4.1.47.Final.jar:/Users/nlee/.gradle/caches/modules-2/files-2.1/io.netty/netty-codec-socks/4.1.46.Final/55ad0081c07888b630f1c6fdea35165dd4558e8/netty-codec-socks-4.1.46.Final.jar:/Users/nlee/.gradle/caches/modules-2/files-2.1/org.reactivestreams/reactive-streams/1.0.3/d9fb7a7926ffa635b3dcaa5049fb2bfa25b3e7d0/reactive-streams-1.0.3.jar:/Users/nlee/.gradle/caches/modules-2/files-2.1/com.sun.activation/javax.activation/1.2.0/bf744c1e2776ed1de3c55c8dac1057ec331ef744/javax.activation-1.2.0.jar:/Users/nlee/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib/1.3.61/4702105e97f7396ae41b113fdbdc180ec1eb1e36/kotlin-stdlib-1.3.61.jar:/Users/nlee/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-common/1.3.61/65abb71d5afb850b68be03987b08e2c864ca3110/kotlin-stdlib-common-1.3.61.jar:/Users/nlee/.gradle/caches/modules-2/files-2.1/io.netty/netty-codec/4.1.47.Final/405cee25864c723a0c0245cce0b8c7c13fd985cf/netty-codec-4.1.47.Final.jar:/Users/nlee/.gradle/caches/modules-2/files-2.1/io.netty/netty-common/4.1.47.Final/dfb32c59232f5709381474ff1dd028b7eb17270a/netty-common-4.1.47.Final.jar:/Users/nlee/.gradle/caches/modules-2/files-2.1/io.netty/netty-resolver/4.1.47.Final/b625d412d1dcd19972475db2690ab4c1f4aebcc5/netty-resolver-4.1.47.Final.jar:/Users/nlee/.gradle/caches/modules-2/files-2.1/io.grpc/grpc-context/1.24.0/abfd83c3b1a8a0fbc12db3529a339b693056f496/grpc-context-1.24.0.jar:/Users/nlee/.gradle/caches/modules-2/files-2.1/org.jetbrains/annotations/13.0/919f0dfe192fb4e063e7dacadee7f8bb9a2672a9/annotations-13.0.jar:/Users/nlee/.gradle/caches/modules-2/files-2.1/com.sun.mail/javax.mail/1.6.2/935151eb71beff17a2ffac15dd80184a99a0514f/javax.mail-1.6.2.jar:/Users/nlee/.gradle/caches/modules-2/files-2.1/javax.activation/activation/1.1/e6cb541461c2834bdea3eb920f1884d1eb508b50/activation-1.1.jar:/Applications/IntelliJ IDEA CE.app/Contents/plugins/testng/lib/jcommander-1.27.jar com.intellij.rt.testng.RemoteTestNGStarter -usedefaultlisteners false -socket62534 @w@/private/var/folders/3z/tkdf05yd60x0hkf1qt240g580000gp/T/idea_working_dirs_testng.tmp -temp /private/var/folders/3z/tkdf05yd60x0hkf1qt240g580000gp/T/idea_testng.tmp
org.testng.TestNGException: 
Cannot instantiate class ld_tests.LessonDeletionTests
    at org.testng.internal.ObjectFactoryImpl.newInstance(ObjectFactoryImpl.java:30)
    at org.testng.internal.InstanceCreator.instantiateUsingDefaultConstructor(InstanceCreator.java:193)
    at org.testng.internal.InstanceCreator.createInstanceUsingObjectFactory(InstanceCreator.java:113)
    at org.testng.internal.InstanceCreator.createInstance(InstanceCreator.java:79)
    at org.testng.internal.ClassImpl.getDefaultInstance(ClassImpl.java:109)
    at org.testng.internal.ClassImpl.getInstances(ClassImpl.java:167)
    at org.testng.TestClass.getInstances(TestClass.java:102)
    at org.testng.TestClass.initTestClassesAndInstances(TestClass.java:82)
    at org.testng.TestClass.init(TestClass.java:74)
    at org.testng.TestClass.<init>(TestClass.java:39)
    at org.testng.TestRunner.initMethods(TestRunner.java:459)
    at org.testng.TestRunner.init(TestRunner.java:338)
    at org.testng.TestRunner.init(TestRunner.java:291)
    at org.testng.TestRunner.<init>(TestRunner.java:179)
    at org.testng.SuiteRunner$DefaultTestRunnerFactory.newTestRunner(SuiteRunner.java:613)
    at org.testng.SuiteRunner.init(SuiteRunner.java:178)
    at org.testng.SuiteRunner.<init>(SuiteRunner.java:112)
    at org.testng.TestNG.createSuiteRunner(TestNG.java:1275)
    at org.testng.TestNG.createSuiteRunners(TestNG.java:1251)
    at org.testng.TestNG.runSuitesLocally(TestNG.java:1100)
    at org.testng.TestNG.runSuites(TestNG.java:1039)
    at org.testng.TestNG.run(TestNG.java:1007)
    at com.intellij.rt.testng.IDEARemoteTestNG.run(IDEARemoteTestNG.java:66)
    at com.intellij.rt.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:110)
Caused by: java.lang.reflect.InvocationTargetException
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:500)
    at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:481)
    at org.testng.internal.ObjectFactoryImpl.newInstance(ObjectFactoryImpl.java:23)
    ... 23 more
Caused by: java.lang.NullPointerException
    at ld_tests.LessonDeletionTests.<init>(LessonDeletionTests.java:25)
    ... 29 more

Process finished with exit code 255

标签: javaseleniumtestingautomated-teststestng

解决方案


推荐阅读