当前位置: 首页 > 知识库问答 >
问题:

硒JUnit:测试顺序/流程?

陶弘业
2023-03-14

我正在使用硒来测试我的爪哇网络应用程序的html页面(实际上是JSP)。我的Web应用程序需要一个流来访问每个页面(它是一个小型的在线游戏Web应用程序),例如:要到达页面B,您需要转到页面A,输入一些文本并按一个按钮才能到达页面B。

我希望能够编写更多的测试,以便在页面 A 运行的测试之后检查我是否将运行页面 B 的测试(对于应用的其余部分,依此类推)。简而言之:以某种方式在我的测试中定义一些顺序。

在过去几天阅读了大量关于测试的资料后,我找不到关于这个特定主题的任何有趣的东西。因此我现在在寻求建议。

我已经确定的可能解决方案:

>

  • 为页面A定义(在同一个测试类中)测试方法,然后为测试B定义测试方法。然后对测试方法的执行进行排序。但我们知道JUnit(但TestNG确实这样做)不允许测试方法执行排序,请参阅SO问题selenium-junit-tests-how-do-i-run-tests-in-a-test-in-equtial-order

    对所有测试进行分组(A页,B页,

    对所有测试进行分组(A页,B页,

    使用JUnit的TestSuite类:它按照测试类在套件中定义的顺序运行套件中列出的测试。因此,这需要有独立的测试方法来测试测试类中的页面A(假设TestA),然后是测试类中测试页面B的所有测试方法(假设TestB),依此类推。然后将它们插入测试套件,例如@SuiteClass({TestA.class,TestB.class,TestC.class,…})

    将JUnit的TestSuite类与JUnit的ErrorCollector类结合使用。哦,好吧,既然我们能,你可能想要在不同的类中分组测试每一页,

    相当激进:使用另一个工具,比如TestNG,来访问一些特性,比如测试方法排序。

    注意:我想有些人会推荐最后一个解决方案(迁移到TestNG),但我也想听听与JUnit相关的其他想法/意见。就像,如果我在一个无法(出于某种原因)迁移到另一个测试框架的团队中工作,那么他们将如何解决这个测试排序问题?

  • 共有3个答案

    景信瑞
    2023-03-14

    我们使用一个名为Cucumber的框架。其行为驱动的发展。因此,本质上,您可以创建不确定流的测试函数,并使用特性来控制测试流。

    示例页面1,输入2输入,单击enter,验证页面2是否加载了内容。

    然后,您将在要素文件中显示以下内容:

    Given Page 1
       Then I enter text1
       Then I enter text2
       Then I click button
       Then I see page 2
    

    在您的代码中,您可以有一个实现这些步骤的类。使用cucumber框架,您可以使用注释来表示您的测试代码和功能文件之间的映射。

    ...
    @Given("^Page 1$")
    public void iLoadPage1() {
      WebDriver driver = new ....
      driver.go('URL');
    }
    
    @Given("I enter (.*)$")
    public void iEnterTest(String txt) {
      ...
    }
    
    ...
    
    杨飞
    2023-03-14

    您可以实现自己的< code>Runner,它可能会包装其他< code>Runner并根据您定义的标准对测试进行排序。这是如果你真的需要这个。

    但是我认为没有必要。我知道如果页面A不起作用,传递到B也不起作用。所以你想先运行测试A,然后运行测试A-

    然而,如果你的意思是你想使用测试A作为测试B的设置操作,这是非常糟糕的做法。您可以使用测试A的逻辑作为测试B的开始,但是您不应该在两个测试之间耦合。一个明显的原因是这使得调试非常困难。调试测试A-

    郑桐
    2023-03-14

    为什么要迁移?您可以使用JUnit进行单元测试,使用另一个框架进行更高级别的测试。在您的情况下,它是一种接受或功能或端到端,如何命名并不重要。但是重要的是理解这些测试不是单元。它们遵循不同的规则:它们更复杂,运行时间更长,频率更低,它们需要复杂的设置、外部依赖性,并且可能偶尔失败。为什么不为他们使用另一个框架(甚至另一种编程语言)?

    可能的变体包括:

    • BDD框架:已经提到了Cucumber、JDave、JBehave、Spock。例如,Spock是基于JUnit的,Groovy=)
    • 测试NG

    如果添加另一个框架不是一个选项:您为JUnit枚举了更多选项,那么我可以想象=)我会将流的整个测试脚本放在一个测试方法中,并将测试代码组织到“Drivers”中。这意味着您的端到端测试不会直接调用您的应用程序或Selenium API的方法,而是将它们包装到Driver组件的方法中,这些方法隐藏了API的复杂性,看起来像是发生了什么或期望发生什么的语句。请看例子:

    @Test 
    public void sniperWinsAnAuctionByBiddingHigher() throws Exception {
        auction.startSellingItem();
    
        application.startBiddingIn(auction);
        auction.hasReceivedJoinRequestFrom(ApplicationRunner.SNIPER_XMPP_ID);
    
        auction.reportPrice(1000, 98, "other bidder");
        application.hasShownSniperIsBidding(auction, 1000, 1098);
    
        auction.hasReceivedBid(1098, ApplicationRunner.SNIPER_XMPP_ID);
    
        auction.reportPrice(1098, 97, ApplicationRunner.SNIPER_XMPP_ID);
        application.hasShownSniperIsWinning(auction, 1098);
    
        auction.announceClosed();
        application.hasShownSniperHasWonAuction(auction, 1098);
    } 
    

    一个片段摘自“由测试引导的不断增长的面向对象的软件”。这本书真的很棒,我强烈建议你读一读。

    这是真正的端到端测试,使用真正的XMPP连接,开火jabber服务器和窗口舔臀摆动GUI测试框架。但是所有这些东西如果卸载到驱动程序组件。在你的测试中,你会看到不同的参与者是如何沟通的。并按顺序排序:在应用程序开始竞价后,我们检查拍卖服务器是否收到加入请求,然后指示拍卖服务器报告新价格并检查它是否反映在UI中,依此类推。整个代码都可以在github上找到。

    github上的例子很复杂,因为这个应用程序并不像书本上的例子那样简单。但是那本书逐渐给出了它,我能够按照书籍指南从头开始构建整个应用程序。事实上,这是我读过的唯一一本关于TDD和自动化开发人员测试的书,给出了如此全面和完整的例子。我读过很多。但是请注意,驱动程序方法并不能让你的测试成为一个单元。它只是允许你隐藏复杂性。它也可以(并且应该)与其他框架一起使用。它们只是为您提供了额外的可能性,可以根据需要将测试拆分为顺序步骤;编写用户可读的测试用例;将测试数据外部化为CSV、Excel表、XML文件或数据库,使您的测试超时;与外部系统、servlet和DI容器集成;单独定义和运行测试组;提供更用户友好的报告等等。

    以及关于制作所有测试单元。除了用于数学,字符串处理等的实用程序库之外,任何操作都是不可能的。如果您的应用程序是完全单元测试的,则意味着您不是测试所有应用程序,或者您不了解哪些测试是单元测试,哪些测试不是单元测试。第一种情况可能是可以的,但是所有未涵盖的内容都必须由开发人员,测试人员,用户或任何人手动测试和重新测试。这是很常见的,但最好是有意识的决定,而不是随意的决定。为什么不能对所有内容进行单元测试?

    单元测试的定义有很多,这导致了圣战)我更喜欢下面这句话:“单元测试是对孤立的程序单元的测试”。有人说:“哎,单位是我申请的!我测试登录,它是简单的单位功能”。但也有孤立隐藏的语用学。为什么我们需要将单元测试与其他测试区分开来?因为这是我们的第一个安全网。他们一定很快。您经常提交(例如,提交到git ),并且至少在每次提交之前运行它们。但是想象一下,运行“单元”测试需要5分钟。你要么减少运行它们的频率,要么减少提交的频率,或者你将只运行一个测试用例,甚至一个测试方法,或者你将每隔2分钟等待测试在5分钟内完成。在那5分钟里,你将进入编码恐惧,在那里你将度过接下来的2个小时=)并且单元测试绝不能偶尔失败。如果他们那样做,你不会信任他们。因此,隔离:您必须从您的单元测试中隔离缓慢和零星失败的来源。因此,隔离意味着单元测试不应该使用:

    • 文件系统
    • 网络、插座、RMI等
    • GUI
    • 多线程
    • 外部库期待测试框架并支持Hamcrest等简单库

    并且单元测试必须是本地的。当您在编码的两分钟内犯了一个缺陷时,您希望只有一个左右的测试失败,而不是整个套件的一半。这意味着在单元测试中测试有状态行为非常有限。您不应该进行5次状态转换以达到前提条件的测试设置。因为第一次过渡失败将会破坏后续过渡的至少4个测试,以及您当前为第6次过渡编写的一个测试。任何重要的应用程序都有大量的流程和状态转换。所以这不能被单元测试。出于同样的原因,单元测试不能在数据库、静态字段、Spring上下文或其他任何地方使用可变的共享状态。这正是JUnit为每个测试方法创建新的测试类实例的原因。

    所以,你看,你不能完全单元测试一个web应用程序,无论你如何重新编码。因为它有流、JSP、servlet容器等等。当然,你可以忽略这个定义,但是它非常有用)如果你同意区分单元测试和其他测试是有用的,并且这个定义有助于实现这一点,那么你将会使用另一个框架或者至少是另一种方法来进行非单元测试,你将会为不同类型的测试创建不同的套件,等等。

    希望,这会有所帮助)

     类似资料:
    • 问题内容: 我正在使用Selenium来测试我的Java Web应用程序的html页面(实际上是JSP)。我的网络应用程序需要访问每个页面的流程(这是一个小型的在线游戏网络应用程序),例如:要进入页面B,您需要进入页面A,输入一些文本,然后按一个按钮进入页面。 B.显然,我已经进行了一些测试来验证A页是否正常工作。 我希望能够编写更多测试,以便在运行A页的测试之后检查是否可以运行B页的测试(其余的

    • 问题内容: 我想选择执行JUnit测试的顺序。我有4个带有几种测试方法的类,我的目标是执行,例如,类A的方法Y,然后是类B的方法X,最后是类A的方法Z。 你能帮忙吗? 问题答案: 通常,您不能指定单独的单元测试的运行顺序(尽管您可以在TestNG中指定优先级,并且每个测试的优先级都不同)。但是,单元测试应该能够独立运行,因此测试的顺序无关紧要。这是一个坏习惯。如果需要按特定顺序进行测试,则应重新考

    • 问题内容: 我想用JUnit测试来验证Java中集合的排序算法。如果我在集合中输入“ B”,“ C”,“ A”并希望对其进行排序(例如,按字母顺序排列),那么使用JUnit进行测试的正确方法是什么? 我实现了Comparable接口,并希望确保排序工作正常。 我想这个问题可以从Java或JUnit扩展到任何语言的常规测试。 问题答案: 我将按 预期的 顺序创建另一个具有值的集合,然后仅检查结果是否

    • 问题内容: 假设JUnit按顺序执行测试用例是否合理:测试用例在下一个测试用例开始之前结束。JUnit版本之间是否有所不同(我的优先级在JUnit4上)?如果没有,是否有一种简单的方法可以强制JUnit按顺序执行测试? 谢谢 问题答案: 是的,默认情况下,我相信它会按顺序运行测试。 JUnit 4.6引入了一个实验来并行运行测试- 我不知道它的当前状态。我希望并行机制在默认情况下仍保持“选择加入”

    • 目前,我正在测试一个具有CRUD操作的类(例如)。按照后面使用的方法,我想按照创建、读取、更新和删除的顺序测试所有操作。 由于JUnit中测试用例的执行顺序依赖于JVM,所以我需要一些适当的方法来确保单元测试用例按照给定的顺序执行。 到目前为止,我提出了以下策略: > 在JUnit4中使用按名称的升序执行方法。然而,这需要重命名测试用例,而且对我来说似乎不是最好的方法,因为在未来需要添加更多的测试