【问题标题】:Number of parameters in method方法中的参数数量
【发布时间】:2011-09-14 08:34:14
【问题描述】:

我有填写表格的 Selenium 测试。我有一个方法,但是这个方法在参数数量方面已经过度增长 -

 newMerchantPage.addEditMerchant(merchantDomain, merchantName,
            merchantCategory, true, merchantDescription, merchantNotes,
            merchantTags, true, true, false, false, merchantTitle,
            additionalDescription, merchantHeading, dummyCouponLink, true);

只有字符串和布尔值。 我正在考虑使用集合,然后在被调用的方法中遍历集合以进行更多处理。虽然还不确定这是否是可行的方法。有什么建议吗?

修改方法:

在实施了几个建议之后,我的方法(不同方法的)调用看起来像 -

ContactPage contactPage = new ContactPage(driver); 
setContactFormData(); 
contactPage.setName(name).setEmailAddress(emailAddress).setSubject(subject).setM‌ ​essage(message); 
contactPage.submitContactForm(contactPage); 

submitContactForm 依次调用不同的实用程序方法。它看起来有多糟糕?特别是最后一行(对对象的方法调用和作为参数传递的同一对象)?

【问题讨论】:

  • 哎哟。我不确定您的代码的其余部分是如何设计的,但似乎许多参数都有一个共同的主题(它们是商家的属性)。您能否创建一个封装这些属性的商家对象,并改为传递商家对象?
  • 我猜 aioobe 和你说的是同一件事 :)
  • 我猜伟大的思想是一样的。 :)

标签: java selenium refactoring


【解决方案1】:

一种常见的方法是将参数包装在一个类中。然后,此类可以提供返回 this 的设置方法,以实现良好的链接。 (见 ProcessBuilder 一个很好的例子。)

示例:

MerchantData data = new MerchantData();   // initialize with sensible defaults

data.setDomain("example.com")
    .setName("Some Name")
    .setTags("tag1, tag2);

newMerchantPage.addEditMerchant(data);

【讨论】:

  • 是的。并且更容易破译哪个参数对应于哪个参数。 :-)
【解决方案2】:

我假设您使用的是 Selenium 服务器(或 RC)。

关于将数据包装到 Merchant 类中的建议都很好而且很有意义,尤其是从纯 Java 编码的角度来看。

但是,您在 Selenium 中的主要关注点是您正在填写的表单,而不是商家域对象。

也许你可以把你的方法分解成更小的方法,比如 openMerchantForm(...) typeNameInMerchantForm(...) 选择MerchantCategory(...)

等等,具体取决于表单上设置的控件类型。这将反映您正在测试的行为,而不是直接设置域对象等。

希望对您有所帮助。

【讨论】:

  • 我有这个想法,但没有提到它以为我会搞砸讨论
  • 我认为这样做是有道理的。您正在尝试模拟填写表单的行为。如果您正在编写一个 jUnit 测试,那么这将是一个不同的故事,并且域对象会更有意义。我认为人们忽略了这是一个硒夹具以及硒的用途......
  • 我想到了其他一些事情,我将有一些小方法来与表单上的这些元素进行交互,然后当我需要提交表单时,这些都可以从一个方法中调用。还在用“aioobe”描述的“测试数据设计”你说呢?
  • 你可以这样做,但是提交方法时是否需要再次调用它们?换句话说,它不会是 1. 在表单上的字段中设置所有这些值 2. 提交。另一边的任何东西(我假设是网络服务器?)都应该照顾其余的。
  • 我明白了,是的,我的意思是一样的
【解决方案3】:

也许——写一个类Merchant,用方法值创建一个实例,然后传递这个实例?

newMerchantPage(Merchant merchant);

优点:您可以将测试参数保存在文件中并执行以下操作:

Merchant merchant = new Merchant();
merchant.populate(File testdata, int record);

【讨论】:

    【解决方案4】:

    您是否考虑过创建一个类,如果您指定的参数属于相同的东西,则将对象作为参数传递。

    【讨论】:

    • 你能用简单的英语解释一下吗?我没有做-1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-18
    相关资源
    最近更新 更多