【问题标题】:Multiple vs single asserts per test in selenium?硒中每个测试的多个与单个断言?
【发布时间】:2021-03-02 12:53:58
【问题描述】:

我正在创建自动冒烟测试。我读过在单元测试中使用多个断言不是一个好习惯,这条规则是否也适用于使用 selenium 的 webdriver 测试?

在我的冒烟测试中,有时我会使用 20 多个断言来验证部分标题、列标题和其他应该出现的文本等信息是否正确显示。

将断言作为不同的测试分开会更好,还是可以在单个测试中拥有多个断言? 如果我在不同的测试中分开运行时间会增加很多。

下面是代码示例:

if self.claimSummaryPage.check_if_claim_exists():
            assert self.claimSummaryPage.return_claim_summary_mosaic_text() == 'RESUMEN'
            assert self.claimSummaryPage.return_claim_notes_mosaic_text() == 'NOTAS'
            assert self.claimSummaryPage.return_claim_documents_mosaic_text() == 'DOCUMENTOS'
            assert self.claimSummaryPage.return_claim_payments_mosaic_text() == 'PAGOS'
            assert self.claimSummaryPage.return_claim_services_mosaic_text() == 'SERVICIOS'
            assert "Detalles del siniestro: " + claim_number in self.claimSummaryPage.return_claim_title_text()
            assert self.claimSummaryPage.return_claim_status_text() in self.claimSummaryPage.CLAIM_STATUS
            self.claimSummaryPage.check_claim_back_button_exists()
            assert self.claimSummaryPage.return_claim_date_of_loss_title() == 'Fecha y hora'
            assert self.claimSummaryPage.return_claim_reported_by_title() == 'Denunciante'
            assert self.claimSummaryPage.return_claim_loss_location_title() == 'Lugar'
            assert self.claimSummaryPage.return_claim_how_reported_title() == 'Reportado en'
            assert self.claimSummaryPage.return_claim_what_happened_title() == '¿Qué sucedió?'
            assert self.claimSummaryPage.return_claim_adjuster_title() == 'Tramitadores'
            assert self.claimSummaryPage.return_claim_parties_involved_title() == 'Partes implicadas'
            if self.claimSummaryPage.check_if_claim_has_exposures():
                assert self.claimSummaryPage.return_claim_adjuster_table_name_column_title() == 'Nombre'
                assert self.claimSummaryPage.return_claim_adjuster_table_segment_column_title() == 'Segmento'
                assert self.claimSummaryPage.return_claim_adjuster_table_incident_column_title() == 'Incidente'
                assert self.claimSummaryPage.return_claim_adjuster_table_state_column_title() == 'Estado'
            else:
                assert self.claimSummaryPage.return_claim_adjuster_table_no_exposures_label_text() == 'No se encontraron exposiciones'

            if self.claimSummaryPage.return_claim_lob(claim_number) == "AUTO":
                assert self.claimSummaryPageAuto.return_claim_loss_cause() in self.claimSummaryPageAuto.CLAIM_AUTO_LOSS_CAUSE
                assert self.claimSummaryPageAuto.return_claim_involved_vehicles_title() == 'Vehículos involucrados'
                self.claimSummaryPageAuto.verify_claim_has_involved_vehicles()
                assert self.claimSummaryPageAuto.return_claim_involved_vehicles_table_make_column_title() == 'Marca'
                assert self.claimSummaryPageAuto.return_claim_involved_vehicles_table_model_column_title() == 'Modelo'
                assert self.claimSummaryPageAuto.return_claim_involved_vehicles_table_year_column_title() == 'Año'
                assert self.claimSummaryPageAuto.return_claim_involved_vehicles_table_license_column_title() == 'Patente'
                assert self.claimSummaryPageAuto.return_claim_involved_vehicles_table_loss_party_column_title() == 'Parte vinculada'
                assert self.claimSummaryPageAuto.return_claim_involved_vehicles_table_damage_column_title() == 'Daños'
                assert self.claimSummaryPageAuto.return_claim_involved_vehicles_table_damage_type_column_title() == 'Tipo de daño'
                assert self.claimSummaryPageAuto.return_claim_involved_vehicles_table_first_item_loss_party_text() in self.claimSummaryPageAuto.VEHICLE_LOSS_PARTY

【问题讨论】:

    标签: selenium


    【解决方案1】:

    测试应该测试系统和用户行为,而不仅仅是断言。

    您可以将测试更改为(“通用示例”):

    让 user 和 summarypage 成为页面对象:

    总结类:

    class summary(){
    
    public static expectedDetails = ["something1", "something2"]
    function getDetails(){
       return [self.claimSummaryPage.return_claim_payments_mosaic_text()]
    }
    
    }
    

    现在你的测试:

    test("validate user can successfully login and vie claim summary"){   
       user.userlogins()
       details = summary.getDetails()
       assert(details).to.be.equal(summary.expectedDetails)   
    }
    

    这里不是单独验证每个字符串,而是保存到一个数组并比较结果数组和预期数组

    这是一种更简洁的方法。不要在 pageobject 中添加断言

    【讨论】:

      【解决方案2】:

      鉴于 gui 测试需要更多时间,因此在每个测试中只使用一个断言可能效率不高。最好的可能是拥有一个测试套件,您可以在其中在同一运行期间为每个测试执行一个断言。我也有经验,我们为 gui 测试实现了自己的断言方法,该方法缓存了 gui 测试中所有断言的结果,并最终通过它们,如果任何缓存的断言失败,则测试失败。这是由于我们当时使用的系统的性质。 也许这可以为您解决问题?

      这是可行的,因为即使断言失败,您所做的断言也不会导致错误,例如如果流程中的某个步骤失败。

      例子:

      my_assertion_cache = list()
      
      def assert_equals(a, b):
          try:
              assert a == b
          except AssertionError:
              # preferably add a reference to the locator where this failed into the message below
              my_assertion_cache.append(f"{a} and {b} was expected to be equal")
      
      
      def run_after_each_test():
          assert mylist == []
      

      【讨论】:

        【解决方案3】:

        一般来说,如果您的第一个断言失败,那么在一个测试中有多个断言的情况下,其他断言将不会被执行。

        另一方面 如果您在测试中没有执行任何新操作,例如您在页面上并且正在检查某些 UI 并且没有执行任何单击、选择或任何新操作,则可以使用多个断言。

        请记住使用自动测试,因此您无需手动运行测试,它们可以更快地发现问题,并且具有更多 精确度。这就是为什么推荐给一个断言,一个测试。

        所以问题可以这样翻译:我想只识别一个问题,还是要识别自动测试的所有可能问题?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-02-22
          • 1970-01-01
          • 2016-07-25
          • 1970-01-01
          • 2014-11-07
          相关资源
          最近更新 更多