测试人员的模式。 代理(替代)

在那之前


你好 我是Dima,我不知道这些模式。 至于测试仪,并不是说有问题。 怎么样一个自动化器..? 好吧,说实话,你也可以生活。

从聊天室,会议和与同事的交流中可以很明显地看出:主要的模式-PageObject-是学习的,还需要什么?

关于我们为什么不真正使用设计模式的问题,这里有一段很大的想法:我们不知道它们,还是没有它们会很好吗? 在历史上也不断加深,模式并不适合您,而是数十年来久经考验的知识和技术,支持和提及反对的知名同志。

但是,最终,知道这些模式绝对不会有任何伤害。

因此,绝不敦促您将模板随处可见以编写代码,我开始发表有关模式的一系列文章。

有关格式的更多信息,让我们开始吧


关于图案本身的文章/书籍/视频课程相当不错。 而且我相信您可以轻松找到具有适当解释的资源,您喜欢的YP上的示例,电子邮件等。

本文章及其后续文章的任务是向已经使用该代码但没有良好理论基础的人员讨论模式。 因此,这些文章也许首先适合我。

好吧,由于我本人是一名测试人员,即使在我的朋友圈中也有很多相同的人,所以故事将倾向于测试自动化。

有些模式看起来很奇怪,但不是很有用。 相反,对于某些工具,您会发现您已经实现了类似的东西很长时间了,只是不知道它被称为那样。
无论如何,我希望您能找到对自己有用的东西。

是的,我会对评论中的建设性批评感到非常高兴。

在这里

  • 对我自己-告诉
  • 将会-告诉
  • 为什么-告诉
  • 为谁和如何-告诉

可以开始了。



代理-代理-代理


理论(一点点)


代理模式(俄语版, 代理 )。 这个想法是为了工作而不是提供真实的对象,而是使用对象的方法加上我们的逻辑(如果我们添加一个逻辑)的替代。 仅此而已。

怎么做:

1.使用我们要替换的对象的公共方法创建一个接口
2.创建一个
-实现此接口
-有权访问原始对象以调用其方法
3.将逻辑添加到创建的类的方法中

练习


实际上,它应该更清楚。

Dano:我们有一个WebDriver。 并且他有一个方法findElements(by by);

任务:我真的需要记录选择器找到了多少个元素。
每次我调用一个方法

driver.findElements(By.cssSelector(".item")); 

我想在日志中查看记录-找到了多少个元素

解决方法1.在额头上。 那里是什么:我用过。
我们接受它,并在每次调用时写出发现的数量:

 List<WebElement> items = driver.findElements(By.cssSelector(".item")); logger.info("Found {} items", items.size()); 

该选项是正常的,而这样的调用很好,比如说7。尽管这种方法的缺点对于至少一次“稍微修改了他们的代码”的人来说已经很明显了。

解决方案2.我们使用代理。
WebDriver是一个界面。 方法已声明,但没有实现。 实现包括ChromeWebDriver,FirefoxWebDriver等。

在测试中,我们无需使用任何特定类别的chrome或safari。 该类仅需要实现WebDriver接口。 我们将这样做:

  1. 我们使用要替换的对象的公共方法创建一个接口
    在我们的示例中,这样的接口已经存在-WebDriver。
  2. 创建一个类
    -实现此接口
    -有权访问原始对象以调用其方法
     public class LoggerWebDriver implements WebDriver{ private WebDriver driver; public void get(String s) { } public List<WebElement> findElements(By by) { return null; } public WebElement findElement(By by) { return null; } //     } 
  3. 将逻辑添加到创建的类的方法中
     public class LoggerWebDriver implements WebDriver { private WebDriver driver; private final Logger logger = LogManager.getLogger(LoggerWebDriver.class); LoggerWebDriver() { //    . // , ()     this.driver = new ChromeDriver(); } public void get(String var1) { driver.get(var1); } public List<WebElement> findElements(By var1) { List<WebElement> items = driver.findElements(var1); logger.info("Selector {}. Found {} elements", var1.toString(), items.size()); return items; } public WebElement findElement(By var1) { return driver.findElement(var1); } //     } 

发生什么事了

添加到课程

 private WebDriver driver; 

这是我们要替换的对象。 我们将进一步调用他的方法。

现在,您可以查看例如

 public void get(String var1) { driver.get(var1); } 

该方法所做的就是在真实驱动程序上调用get()。

这是方法

 public List<WebElement> findElements(By var1) { List<WebElement> items = driver.findElements(var1); logger.info("Selector {}. Found {} elements", var1.toString(), items.size()); return items; } 

我们已根据任务扩展。

您可以在测试中使用这些:

 WebDriver driver = new LoggerWebDriver(); driver.get("http://google.com"); List<WebElement> items = driver.findElements(By.cssSelector("a")); // => Selector By.cssSelector: a. Found 48 elements 



在这里 如果您需要挂起日志记录,缓存,延迟初始化,对方法的访问控制,则该模式非常有用。 通常,如果您正在编写代码,并且确实希望功能具有某种中间层,则选项之一是代理。

现在我们知道了另一种模式,让我提醒您,当您手中拿着锤子时,我们周围的一切似乎都是钉子。 请记住这一点。

Source: https://habr.com/ru/post/zh-CN414253/


All Articles