当前位置: 首页 > 知识库问答 >
问题:

如何创建添加日志消息的BaseClass

童子明
2023-03-14

我使用serenity BDD进行自动化测试,使用页面对象模型进行框架测试。我创建了一个BasePage类,它将被所有其他页面继承。我想通过添加所有日志来最小化来自页面的日志消息。将信息消息发送到中央基本页。例如,在调用click()方法时,我将在basePage类中记录单击前和单击后的方法,如下所示:

公共类BasePage扩展了PageObject{

private static final Logger log = LogManager.getLogger(BasePage.class.getClass());
private final WebElementFacade element;

public static void clickBtn(WebElementFacade btnName) {
        log.info("About to click " + btnName + " button");
        btnName.click();
        log.info("Successfully clicked on " + btnName + " button.");        
    }

后来我发现,与其单独尝试预先确定用户将在webElements上执行哪些操作,并为每个操作编写新方法(如上图所示),不如实现WebDriverFacade界面,因此,我从WebDriverFacade获取BasePage中所有未实现的方法列表,然后在每个方法中写入日志消息,如下所示:

公共类BasePage扩展PageObject实现WebElementFacade{

private static final Logger log = LogManager.getLogger(BasePage.class.getClass());
private final WebElementFacade element;

@Override
public void submit() {
    // TODO Auto-generated method stub
    
}

@Override
public void sendKeys(CharSequence... keysToSend) {
    // TODO Auto-generated method stub
    
}

@Override
public String getTagName() {
    // TODO Auto-generated method stub
    return null;
}

@Override
public boolean isSelected() {
    // TODO Auto-generated method stub
    return false;
}
        .
        .
        .
        .
        .

}

这将有两个目的:

  1. 我不必为BasePage类中的每个操作创建新方法,例如第一个代码中的“clickBtn()”函数
  2. 正如我之前提到的,我不必弄清楚任何其他向我的代码中添加方法的人可能会使用什么方法,也不必更改BasePage类来创建新操作。所以从长远来看,基本上减少了维护

我面临的问题是在第二个用例中收到的错误:

返回类型与继承的WebElementFacade方法不兼容。withTimeoutOf(int,TimeUnit),PageObject。withTimeoutOf(整数,时间单位)

现在我的问题是:

  1. 如何解决这个问题
  2. 这是做事情的正确方法吗?还是我应该使用第一种方法并增加维护开销

我想这可能是另一个有用的场景。确保子类方法不使用pageObject中的方法,并且只能使用基类中的方法。这可以通过包装WebElementFacade并添加日志消息作为附加功能来实现。如果您对此有任何想法,我们将不胜感激。非常感谢。

共有1个答案

郎雅昶
2023-03-14

老实说,这是一个巧妙的技巧,如果你成功了,你应该感到自豪。我想我在动态语言中找到了类似的东西。但是你最好只是添加日志条目并学习以下内容。

如何命名函数,这样你就不会觉得它们需要重命名。如何清楚地记录以供调试使用。

这是因为伐木的力量在于它的灵活性。当你学会如何处理复杂的事情,比如矩阵,这样你就可以看到它,然后你就可以提高你的整体技能了。

我很抱歉没有给你代码,但我觉得一些“追逐另一只兔子”的建议更好。

 类似资料:
  • 我正在尝试将一个值设置为MDC,以便在有日志的情况下显示在每个日志行中。如果kafka producer中有info(“”),那么日志就不会显示我之前为MDC添加的值。 我有一个拦截器来为correlationId设置“默认值” 我设置了 MDC 相关 Id 值,当它进入控制器时。 仅用于Kafka日志不包括之前添加的 MDC 消息 2022-06-08 10:15:31.616 INFO { c

  • 本文向大家介绍C# 如何添加错误日志信息,包括了C# 如何添加错误日志信息的使用技巧和注意事项,需要的朋友参考一下 系统日志 系统日志包含了由Windows系统组件记录的事件。例如,在启动期间装入驱动程序或其他系统组件失败被记录到系统日志。要查看系统日志: 打开命令提示符。 在提示符下输入eventvwr。这打开了Windows事件查看器。 应用程序日志 应用程序日志包含了由应用程序或程序记录的事

  • 在我的Android应用程序中,我收到使用Firebase发送的消息,问题不是所有消息都到达,有时消息到达非常慢。 在我的服务器端,我跟踪我发送到FCM的消息,我总是收到成功:来自FCM的1个响应,仍然有我在Android应用程序中没有收到的消息。 我认为FCM消息日志在上面描述的情况下会有很大的帮助,但我不确定是否存在此选项。 有办法浏览Firebase消息日志吗?

  • 我很高兴地使用SLF4J和logback和使用2个附加为根记录器。 stdout的调试级别 文件的信息级别 所有日志都需要成为输出的一部分(因此需要根记录器)。

  • 我正在开发一个简单的桌面应用程序(不是webapp)。 它们有不同的模式。好像他们忽略了我的设置。 我也试着应用我在这里找到的建议: https://spring.io/blog/2009/12/04/logging-dependencies-in-spring

  • 我想开始记录跟踪信息,因此添加了: Sleuth将跟踪信息添加到日志行,但我在模式https://github.com/spring-projects/spring-boot/blob/2.3.x/spring-boot-project/spring-boot/src/main/resources/org/springframework/boot/logback/defaults.xml中找不到任