多年来一直关注我博客的人可能已经发现了,每当我想学习一些东西时,我会挑战自己写一篇关于它的博客文章。在2020年,我每个月读一本关于软件测试的书,并写一篇书评。在2023年,我每个月都了解到一个逻辑谬误,并写一篇文章来解释它(这最终变成了我的书《测试者的逻辑谬误》)。
在接下来的五个月里,我将接受一个新的挑战:学习如何编写高质量代码的SOLID原则。多年来,我一直想了解这些,但我一直对术语感到恐惧(“Liskov代入”听起来太复杂了!)。但是我将尽我所能去学习这些原则,并用对软件测试人员有用的例子来解释它们。让我们从单一职责原则开始,了解SOLID中的“S”。
单一责任原则指的是一个类应该只有一个职责。让我们来看一下这个Login类:
class Login {
constructor() {}
login(username, password) {
driver.findElement(By.id('username'))
.sendKeys(username)
driver.findElement(By.id('password'))
.sendKeys(password)
driver.findElement(By.id('submit')).click()
}
navigate(url) {
driver.get(url)
}
}
登录类有两个方法:登录和导航。对于编写自动化测试的人来说,这似乎是有道理的,因为登录和导航通常都出现在测试的开始部分。但实际上,登录和导航是两个完全不同的东西。
让我们想象一下,现在应用程序的用户可以选择多因素身份验证。测试自动化工程师现在想要添加一个新的登录方法,其中包括多因素身份验证。但是这会对导航方法产生什么影响呢?可能这根本没有任何影响,但如果需要向类中添加新的包导入,就有可能会破坏导航方法。
任何一个类的变化,都有可能破坏现有的功能。除了检查每个登录的测试之外,测试自动化工程师还需要检查每个有导航的测试。
这就是为什么最好只给类一个职责。应该把导航方法移到它自己的类中。这样当添加新的登录方法时,导航方法将完全不受影响。而且还可以在不影响登录方法的情况下,向导航类添加新的导航方法!