1

我的情况如下:

我有几个测试用例:

  • 用户登录网站;
  • 用户打开主页;
  • 用户看到一些信息,不是那么重要,可能是一些表或 div 等。
  • 用户转到帮助台页面。
  • 用户转到 CustomPage。
  • 用户在页面上看到一些自定义信息。
  • 以及越来越多的其他案例。

我的任务是通过 Selenium Driver 和 JUnit 在不同用户(admin1、admin2、userWithoutAccess 等)下测试所有这些案例。

但是,目前,我没有为我的任务看到任何有效的解决方案:(

例如:

public class HelpDeskPageTest
{
    private static WebDriver driver;

    HelpDeskPage helpDeskPage;

    @BeforeClass
    public static void setUpClass()
    {
        driver = new FirefoxDriver();
        Utils.logon(driver, "admin", "1234");
    }

    @AfterClass
    public static void tearDownClass()
    {
      driver.quit();
    }

    @Before
    public void setUp()
    {
        helpDeskPage = HelpDeskPage.open(driver);
    }

    @Test
    public void helpDeskPageIsOpen()
    {
        assertTrue(channelBrowserPage.getTitle().equals("Google: Internal HelpDesk"));
    }
}

这段代码有什么作用?此代码仅测试用户 admin 是否可以打开帮助台页面。此外,HelpDeskPageTest类可以包含许多其他测试方法,用于测试 HelpDesk Page 上的管理员操作。没关系。

你可以问我:那么,你是从哪里看出问题的呢?我的回答如下:

  1. 如果我想为其他用户测试相同的功能(例如:)admin2。我该怎么做?我必须使用名称创建相同的测试类:HelpDeskPageTestForAdmin2,修改@BeforeClass 方法(登录为admin2),然后复制所有其他代码HelpDeskPageTest?但这直接违反了DRY原则!我怎样才能避免这种情况?
  2. 站点包含许多不同的页面(Login, Home, HelpDesk, CustomPage1, CustomPage2...)。对于单独的页面,我制作了单独的测试类(LoginPageTest,,,HomePageTestHelpDeskPageTest。所有测试类都是相互独立的。结果我花了很多时间来@BeforeClass实例WebDriver化(> 10秒)的方法。这么长!我怎样才能避免这种时间延迟?如何在所有睾丸内共享实例?

JUnit 如何帮助我解决问题?

4

4 回答 4

2

当然你需要某种参数化。哪一个,取决于你到底需要什么。如果您想使用相同的参数集运行测试类中的所有方法,那么您需要@Parameters. 然后你可以有你的参数,例如"admin", "adminPassword",每个方法都将在这些参数可访问的情况下运行。

但是,如果您需要每个方法具有不同的参数集,那么:如果您在编译时知道所有参数,请检查zohhak。如果您想要来自文件或其他提供者的参数,请检查junitParams

于 2012-12-24T16:01:43.043 回答
1

您在这里所做的不是单元测试,而只是使用 junit 作为帮助程序来运行集成或系统测试。这很常见,并不是做错任何事的迹象。但这确实意味着应该忽略适用于使用 junit进行单元测试的一般准则、特性和最佳实践。

所以忘记每个测试的一个断言,以及像@Before 这样的大多数注释。只需为每个测试用例编写一个方法,可能在代表主题或功能的同一个测试类中。

所以:

@Test 无效 testLoginAndOut() ...

@Test testLoginAndOpenHelpDeskPage() ..

像往常一样使用通用例程(例如 void loginAUser(String name) 来防止重复代码。

于 2012-12-24T15:12:27.897 回答
0

您可以通过在 Junit 中也作为 TestNg 动态传递来使用不同的数据重复您的测试。

使用参数化类,您可以实现这一点。

例如,请参见下面的帖子。

http://isagoksu.com/2009/development/agile-development/test-driven-development/using-junit-parameterized-annotation/

于 2012-12-24T15:00:11.367 回答
0

您可以使用带有 JUnit 的参数化测试来执行此操作,但您需要使用JUnit 4.11或更高版本。你可以看到我在这里做的一个例子

使用 Gradle,您的构建依赖项将如下所示:

dependencies {
    // stored at: %HOMEPATH%/.gradle/caches/artifacts-14/filestore
    compile group: 'org.sikuli', name: 'sikuli-api', version: '1.0.+'
    compile group: 'org.seleniumhq.selenium', name: 'selenium-java', version: '2.+'
    compile group: 'commons-collections', name: 'commons-collections', version: '3.+'
    compile group: 'junit', name: 'junit', version: '4.+'
    compile group: 'commons-lang', name: 'commons-lang', version: '2.+'
    compile group: 'commons-io', name: 'commons-io', version: '2.+'
}
于 2012-12-24T19:44:04.440 回答