一:每次运行都需要打开代码工具,如eclipse或者IDE等。为了后面的持续集成,直接使用Maven命令去运行自动化测试,需要引入surfire插件。笔者使用的是2.10版本Surefire和6.9.10版本TESTNG。

 下面是项目完整的pom文件:

<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.claire.leafly</groupId>
    <artifactId>projectLemon</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <dependencies>

        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-java</artifactId>
            <version>3.4.0</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.testng/testng -->
        <dependency>
            <groupId>org.testng</groupId>
            <artifactId>testng</artifactId>
            <version>6.9.10</version>
            <scope>test</scope>
        </dependency>

        <!-- https://mvnrepository.com/artifact/dom4j/dom4j -->
        <dependency>
            <groupId>dom4j</groupId>
            <artifactId>dom4j</artifactId>
            <version>1.6.1</version>
        </dependency>


        <!-- https://mvnrepository.com/artifact/log4j/log4j -->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.17</version>
        </dependency>


        <dependency>
            <groupId>xml-apis</groupId>
            <artifactId>xml-apis</artifactId>
            <version>1.4.01</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.uncommons/reportng -->
        <dependency>
            <groupId>org.uncommons</groupId>
            <artifactId>reportng</artifactId>
            <version>1.1.4</version>
            <scope>test</scope>
        </dependency>

        <!-- https://mvnrepository.com/artifact/com.google.inject/guice -->
        <dependency>
            <groupId>com.google.inject</groupId>
            <artifactId>guice</artifactId>
            <version>3.0</version>
        </dependency>


        <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.1</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.11</version>
</dependency>




    </dependencies>
    <build>
        <plugins>
            <!-- 1:解决每次右键项目名-maven->update project 时候,项目jdk版本变了,变回1.5版本或者其他版本 2: 解决使用maven编译其他问题:如提示不能在内部类访问外部非final局部变量 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.5.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.10</version>
                <configuration>
                    <systemPropertyVariables>
                        <org.uncommons.reportng.escape-output>false</org.uncommons.reportng.escape-output>//是否忽略html,解释见下图。与之后在reportNg报告上显示截图相关。
                    </systemPropertyVariables>
                    <testFailureIgnore>true</testFailureIgnore>//测试失败后,是否忽略并继续测试
                    <argLine>
                        -Dfile.encoding=UTF-8
                    </argLine>

                    <suiteXmlFiles>
                        <suiteXmlFile>register.xml</suiteXmlFile>//代表的是要执行的测试套件名称
                    </suiteXmlFiles>

                </configuration>
            </plugin>

        </plugins>
    </build>

</project>

自动化测试--实现一套完全解耦的简单测试框架(二)

该配置与reportng相关,后面有详细的解释和源码。

 

 在pom中设置好surefire插件之后,即可使用maven test来执行设置好的测试套件。

注意点(坑):

1.读者使用的各插件或者jar包版本与笔者不同,在执行maventest时,如果未能执行测试套件。请尝试选择不同的suifire插件版本。

2.如上配置的<suiteXmlFile>register.xml</suiteXmlFile>---------------------register.xml该文件一般都放置在根目录下,否则有时会报错

 

 

二、在测试完成之后,通常希望得到一份完善的测试报告。TESTNG的测试报告,太过简陋,笔者引入reportNG的jar包

1.引入reportng依赖

2.在register.xml中,添加监听器NewHtmlReporter,用于渲染reportng 生成的测试报告。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >

<suite name="suitName_register" parallel="false">

    <test name="testName_register">

        <classes>

            <!-- <class name="com.demo.auto.claire.testcase.register.Register_FailTester_001" /> -->
            <class name="com.demo.auto.claire.testcase.register.Register_SuccessTester_002" />

        </classes>
    </test> <!-- Test -->
    <listeners>
    <!-- 添加监听,生成测试报告 -->
    <listener class-name="org.uncommons.reportng.HTMLReporter" />//先添加该监听器,后面添加自定义监听器NewHtmlReporter后,该监听器就可以删掉了
 <!-- 添加自定义监听,该监听继承了reportNg的 HTMLReporter--> 
<!-- <listener class-name="com.demo.auto.claire.util.NewHtmlReporter" />-->

<!--添加自定义监听器,在测试失败的时候进行截图 -->

<listener class-name="com.demo.auto.claire.listener.ListenerFailTestScreenShot">
</
listener>

</listeners>

</suite>

<!-- Suite -->

 

 

注意(坑):

对项目右键--run as --maven test时,如果报Injector类找不到时,需要引入guice依赖。(也可以升级testng的版本,查找到依赖了guice jar的相应版本即可)

 

三:此时使用reportng生成了测试报告,比testng的要美观一些。但是我们希望可以对其进行定制

1.显示出每一列的名称

2.显示错误的截图.效果如下:自动化测试--实现一套完全解耦的简单测试框架(二)

 

 

1.在测试完成之后,需要对失败的用例进行截图。自定义监听器,在测试失败的时候,进行截图。

 

看一下关于监听的继承和实现关系图

自动化测试--实现一套完全解耦的简单测试框架(二)

 

 可以看到,ITestListener接口中定义了方法onTestFailure,自定义监听类可以实现改接口,重写该方法。但是,此时需要重写改接口所有的方法。即使方法体里面为空,代码也不会美观。最后笔者选择将自定义监听器继承类TestListenerAdapter,只重写该类中的onTestFailure方法即可。下面是代码示例:

 

 1 package com.demo.auto.claire.listener;
 2 
 3 import java.io.File;
 4 import java.io.IOException;
 5 import java.text.SimpleDateFormat;
 6 import java.util.Calendar;
 7 
 8 import org.apache.bcel.generic.SIPUSH;
 9 import org.testng.ITestResult;
10 import org.testng.Reporter;
11 import org.testng.TestListenerAdapter;
12 
13 import com.demo.auto.claire.base.BaseTester;
14 import com.demo.auto.claire.util.ScreenShotUtil;
15 
16 public class ListenerFailTestScreenShot extends TestListenerAdapter {
17 
18     @Override
19     public void onTestFailure(ITestResult tr) {
20         
21         // 获取到当前的年月日
22         SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
23         Calendar calendar = Calendar.getInstance();
24         //calendar.getTime()得到的时间是这样的:Fri Aug 31 16:16:51 CST 2018,需要格式化成年月日
25         String time = dateFormat.format(calendar.getTime());
26         //也可以直接使用 
27         //String time2 =  dateFormat.format(new java.util.Date()
28         
29         //获得几点周几
30         //SimpleDateFormat dateFormat2 = new SimpleDateFormat("EEEE");
31         //String week = dateFormat2.format(new java.util.Date());
32         
33         // D:\myTest\projectLemon\target\surefire-reports\registertest_register_success_002\2018-08-31
34         
35                 String outPutDirectory=tr.getTestContext().getOutputDirectory();
36                 //获取到测试的方法名称
37                 String methodName= tr.getName();
38                 
39                 String path1 = outPutDirectory +File.separator+methodName +File.separator+time;
40                 /*System.out.println("##################################");
41                 System.out.println(path1);
42                 System.out.println(outPutDirectory);
43                 System.out.println(methodName);*/
44                 
45                 String imgName=null;
46 
47         
48         try {
49             //当测试不通过的时候,调用截图的代码
50             imgName = ScreenShotUtil.screenShot(BaseTester.driver, path1);
51         } catch (IOException e) {
52 
53             e.printStackTrace();
54         }
55         
56         //Reporter.log("测试代码");
57         //http://localhost:7777/registertest_register_success_002/2018-09-01%E6%98%9F%E6%9C%9F%E5%85%AD/1535807491038.png
58         //String imgHerf2 ="/" +methodName+"/"+ time+"/"+imgName;
59         String suitName = tr.getTestContext().getCurrentXmlTest().getSuite().getName();
60         String imgHerf = "../" +String.join("/",suitName, methodName,time,imgName);
61         //下面这句代码是将截图添加到reportNg的报告中使用的,log的内容会显示在报告上
62         Reporter.log("<img  src='" + imgHerf +"' width='100' height='100'><a href='"+imgHerf+ "' target='_blank'>查看大图</a></img>");
63 //        System.out.println("******************************");
64 //        System.out.println(imgHerf);
65 
66         
67         super.onTestFailure(tr);
68     }
69 
70 }
View Code

相关文章:

  • 2022-12-23
  • 2021-07-01
  • 2021-06-30
  • 2021-10-03
  • 2021-09-13
  • 2021-10-27
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2021-05-04
  • 2021-07-06
  • 2021-09-20
  • 2021-12-12
  • 2021-09-15
相关资源
相似解决方案