方法中的参数数量

4

我有一个使用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逐个调用不同的实用程序方法。它看起来有多糟糕?特别是最后一行(在对象上调用方法并将相同的对象作为参数传递)?


5
哎呀,我不确定你的代码的其余部分是如何设计的,但似乎许多参数都有一个共同的主题(它们是商家的属性)。你能否创建一个封装这些属性的商家对象,并传递商家对象呢? - user937146
我猜aioobe和你在说同样的事情 :) - Tarun
1
我猜大家都有高见。 :) - user937146
4个回答

5

一种常见的方法是将参数封装在一个类中。这个类可以提供设置方法,返回this以实现优雅的链接(例如查看ProcessBuilder的示例)。

示例:

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

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

newMerchantPage.addEditMerchant(data);

是的。并且更容易辨别哪个参数对应哪个形参。 :-) - aioobe

2
我假设您正在使用Selenium服务器(或RC)。
将数据封装到Merchant类中的建议都很好,并且从纯Java编码角度来看是有道理的。
然而,在Selenium中,您关注的主要问题是填写的表单,而不是商家领域对象。
也许您可以将方法分解为更小的方法,例如openMerchantForm(...)、typeNameInMerchantForm(...)、chooseMerchantCategory(...)等,具体取决于在表单上设置的控件类型。这将反映您正在测试的行为,而不是直接设置领域对象等。
希望这可以帮助您。

1
我有这个想法,但没有提及,因为我认为这会破坏讨论。 - Tarun
我认为这样做是有道理的。你正在尝试模拟填写表单的行为。如果你正在编写jUnit测试,那么情况就不同了,领域对象会更有意义。我认为人们忽略了这是一个Selenium夹具以及Selenium的用途... - Ashkan Aryan
我脑海中突然想到一个点子,我可以编写一些小方法来与表单上的这些元素进行交互,然后在需要提交表单时从一个方法中调用它们。不过,仍然要使用"aioobe"所描述的“测试数据设计”,你觉得呢? - Tarun
你确实可以这样做,但是在提交方法时需要再次调用它们吗?换句话说,不是应该1. 在表单上设置所有这些字段的值2. 提交。另一边(我假设是Web服务器?)应该处理其余部分。 - Ashkan Aryan
我明白,是的,我的意思和你一样。 - Tarun
好的,我做了这个。我没有为对象保留单独的类,而是使用页面对象代替。来自我的另一个示例 -ContactPage contactPage = new ContactPage(driver); setContactFormData(); contactPage.setName(name).setEmailAddress(emailAddress).setSubject(subject).setMessage(message); contactPage.submitContactForm(contactPage);submitContactForm 反过来调用不同的实用方法。看起来有多糟糕?特别是最后一行(在对象上调用方法并将相同对象作为参数传递)? - Tarun

1
也许可以编写一个名为 Merchant 的类,使用 方法值 创建实例,并将该实例代替原有内容传递?
newMerchantPage(Merchant merchant);

优点:您可以将测试参数保存在文件中,并执行以下操作:
Merchant merchant = new Merchant();
merchant.populate(File testdata, int record);

0
你有没有考虑过创建一个类,如果你指定的参数属于同一类别,那么将对象作为参数传递。

你能用简单易懂的语言解释一下吗?我没有做-1。 - Tarun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接