精华内容
下载资源
问答
  • 测试报告-模板

    2018-01-04 10:40:42
    1.需要有web测试经验,可以独立跟进项目 ...4.熟悉兼容性测试目的、方法、测试点 5.掌握抓包工具,能够抓包查看数据,简单定位问题 6沟通能力好,能够推动开发解决问题 加分项: 熟悉web性能测试,安全性测试
  • 软件测试计划 1.产品的背景 2.计划书编写的目的-版本号 3.资源的准备  a.需求的prd-原型图地址等  b.... c.... d....4.测试的周期-人员的分配 ... a.... b.安装卸载测试,强制更新测试,兼容性测试,压力...

    软件测试计划
    1.产品的背景
    2.计划书编写的目的-版本号
    3.资源的准备
        a.需求的prd-原型图地址等
        b.测试环境的搭建-在那些环境下测试-网络环境
        c.测试的范围-本期着重测试的部分
        d.测试手机及系统的准备
    4.测试的周期-人员的分配
    5.测试的方法及策略
        a.黑盒测试-性能测试-自动化测试
        b.安装卸载测试,强制更新测试,兼容性测试,压力测试,负载测试,弱网测试,Ui测试
        c.边界值,等价类,因果图
    6.测试用例的编写及执行的进度
    7.bug的提交及跟踪
    8.风险评估


    软件测试报告

    1.软件测试的需求-本期迭代的功能点
    2.测试人员的分配及测试周期
    3.测试中总测试用例多少条,测试通过多少条,未通过多少条,遗留bug多少条加原因
    4.测试的风险评估

    展开全文
  • 目 录 3 1引言 4 1.1编写目的 4 ...5.4兼容性 11 5.5安全性 11 6 分析摘要 12 6.1 覆盖率 12 6.2 遗留缺陷的影响 12 6.3 建议 14 7度量 14 7.1 资源消耗 14 7.2 缺陷密度 14 8典型缺陷引入原因分析 14
  • testng自定义html报告

    千次阅读 2018-10-24 10:38:34
    自定义测试报告模板report.vm 扩展实现IReporter接口 工具类 testng自带的报告,有如下几个问题: 1. 不是很美观 2.html报告中js是外置的,在集成jenkins和浏览器兼容性上均存在一些小问题。因此决定自定义一个...

    目录

    实现原理

    源码展示

    定义测试结果类TestResult

    定义 TestResultCollection 集合类

    自定义测试报告模板report.vm

    扩展实现IReporter接口

    工具类


    testng自带的报告,有如下几个问题:

    1. 不是很美观

    2.html报告中js是外置的,在集成jenkins和浏览器兼容性上均存在一些小问题。因此决定自定义一个测试报告。

          自定义的报告截图如下

    实现原理

    testng对外提供了很多扩展接口,其中测试报告的扩展接口为IReporter接口

    package org.testng;
    
    import java.util.List;
    import org.testng.xml.XmlSuite;
    
    /*实现这个接口,并且配置testng监听器就可以了*/
    public interface IReporter extends ITestNGListener {
        default void generateReport(List<XmlSuite> var1, List<ISuite> var2, String var3) {
        }
    }
    

    因此实现该接口,并且在testng框架里面配置listener即可,关于监听器的配置,请参照 https://testng.org/doc/documentation-main.html#testng-listeners

    本扩展程序就是实现该接口,并且自定义html模板,最终通过Velocity渲染出html报告

    源码展示

    定义测试结果类TestResult

    用于存储测试结果

    package org.clearfuny.funnytest.interner.reporter;
    
    import org.clearfuny.funnytest.util.ExceptionUtil;
    
    import java.util.List;
    
    public class TestResult {
    
        private String testName; //测试方法名
        private String className; //测试类名
        private String caseName;
        private String params; //测试用参数
        private String description; //测试描述
        private List<String> output; //Reporter Output
        private Throwable throwable; //测试异常原因
        private String throwableTrace;
        private int status; //状态
        private String duration;
    
        private boolean success;
    
    
        public String getTestName() {
            return testName;
        }
    
        public void setTestName(String testName) {
            this.testName = testName;
        }
    
        public String getClassName() {
            return className;
        }
    
        public void setClassName(String className) {
            this.className = className;
        }
    
        public String getCaseName() {
            return caseName;
        }
    
        public void setCaseName(String caseName) {
            this.caseName = caseName;
        }
    
        public String getParams() {
            return params;
        }
    
        public void setParams(String params) {
            this.params = params;
        }
    
        public String getDescription() {
            return description;
        }
    
        public void setDescription(String description) {
            this.description = description;
        }
    
        public List<String> getOutput() {
            return output;
        }
    
        public void setOutput(List<String> output) {
            this.output = output;
        }
    
        public Throwable getThrowable() {
            return throwable;
        }
    
        public void setThrowable(Throwable throwable) {
            this.throwable = throwable;
            this.throwableTrace = ExceptionUtil.getStackTrace(throwable);
        }
    
        public int getStatus() {
            return status;
        }
    
        public void setStatus(int status) {
            this.status = status;
        }
    
        public String getDuration() {
            return duration;
        }
    
        public void setDuration(String duration) {
            this.duration = duration;
        }
    
        public boolean isSuccess() {
            return success;
        }
    
        public void setSuccess(boolean success) {
            this.success = success;
        }
    
        public String getThrowableTrace() {
            return throwableTrace;
        }
    
        public void setThrowableTrace(String throwableTrace) {
            this.throwableTrace = throwableTrace;
        }
    }
    

    定义 TestResultCollection 集合类

    testng采用数据驱动,一个测试类可以有多个测试用例集合,每个测试类,应该有个测试结果集

    package org.clearfuny.funnytest.interner.reporter;
    
    
    import org.testng.ITestResult;
    
    import java.util.LinkedList;
    import java.util.List;
    
    public class TestResultCollection {
    
        private int totalSize = 0;
    
        private int successSize = 0;
    
        private int failedSize = 0;
    
        private int errorSize = 0;
    
        private int skippedSize = 0;
    
        private List<TestResult> resultList;
    
    
        public void addTestResult(TestResult result) {
            if (resultList == null) {
                resultList = new LinkedList<>();
            }
            resultList.add(result);
    
            switch (result.getStatus()) {
                case ITestResult.FAILURE:
                    failedSize+=1;
                    break;
                case ITestResult.SUCCESS:
                    successSize+=1;
                    break;
                case ITestResult.SKIP:
                    skippedSize+=1;
                    break;
            }
    
            totalSize+=1;
        }
    
        /*===============================[getter && setter]=================================*/
    
        public int getTotalSize() {
            return totalSize;
        }
    
        public void setTotalSize(int totalSize) {
            this.totalSize = totalSize;
        }
    
        public int getSuccessSize() {
            return successSize;
        }
    
        public void setSuccessSize(int successSize) {
            this.successSize = successSize;
        }
    
        public int getFailedSize() {
            return failedSize;
        }
    
        public void setFailedSize(int failedSize) {
            this.failedSize = failedSize;
        }
    
        public int getErrorSize() {
            return errorSize;
        }
    
        public void setErrorSize(int errorSize) {
            this.errorSize = errorSize;
        }
    
        public int getSkippedSize() {
            return skippedSize;
        }
    
        public void setSkippedSize(int skippedSize) {
            this.skippedSize = skippedSize;
        }
    
        public List<TestResult> getResultList() {
            return resultList;
        }
    
        public void setResultList(List<TestResult> resultList) {
            this.resultList = resultList;
        }
    }
    

    自定义测试报告模板report.vm

    <head>
        <meta content="text/html; charset=utf-8" http-equiv="content-type"/>
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title> - TestReport</title>
        <style>
            body {
                background-color: #f2f2f2;
                color: #333;
                margin: 0 auto;
                width: 960px;
            }
    
            #summary {
                width: 960px;
                margin-bottom: 20px;
            }
    
            #summary th {
                background-color: skyblue;
                padding: 5px 12px;
            }
    
            #summary td {
                background-color: lightblue;
                text-align: center;
                padding: 4px 8px;
            }
    
            .details {
                width: 960px;
                margin-bottom: 20px;
            }
    
            .details th {
                background-color: skyblue;
                padding: 5px 12px;
            }
    
            .details tr .passed {
                background-color: lightgreen;
            }
    
            .details tr .failed {
                background-color: red;
            }
    
            .details tr .unchecked {
                background-color: gray;
            }
    
            .details td {
                background-color: lightblue;
                padding: 5px 12px;
            }
    
            .details .detail {
                background-color: lightgrey;
                font-size: smaller;
                padding: 5px 10px;
                text-align: center;
            }
    
            .details .success {
                background-color: greenyellow;
            }
    
            .details .error {
                background-color: red;
            }
    
            .details .failure {
                background-color: salmon;
            }
    
            .details .skipped {
                background-color: gray;
            }
    
            .button {
                font-size: 1em;
                padding: 6px;
                width: 4em;
                text-align: center;
                background-color: #06d85f;
                border-radius: 20px/50px;
                cursor: pointer;
                transition: all 0.3s ease-out;
            }
    
            a.button {
                color: gray;
                text-decoration: none;
            }
    
            .button:hover {
                background: #2cffbd;
            }
    
            .overlay {
                position: fixed;
                top: 0;
                bottom: 0;
                left: 0;
                right: 0;
                background: rgba(0, 0, 0, 0.7);
                transition: opacity 500ms;
                visibility: hidden;
                opacity: 0;
            }
    
            .overlay:target {
                visibility: visible;
                opacity: 1;
            }
    
            .popup {
                margin: 70px auto;
                padding: 20px;
                background: #fff;
                border-radius: 10px;
                width: 50%;
                position: relative;
                transition: all 3s ease-in-out;
            }
    
            .popup h2 {
                margin-top: 0;
                color: #333;
                font-family: Tahoma, Arial, sans-serif;
            }
    
            .popup .close {
                position: absolute;
                top: 20px;
                right: 30px;
                transition: all 200ms;
                font-size: 30px;
                font-weight: bold;
                text-decoration: none;
                color: #333;
            }
    
            .popup .close:hover {
                color: #06d85f;
            }
    
            .popup .content {
                max-height: 80%;
                overflow: auto;
                text-align: left;
            }
    
            @media screen and (max-width: 700px) {
                .box {
                    width: 70%;
                }
    
                .popup {
                    width: 70%;
                }
            }
    
        </style>
    </head>
    
    <body>
    <h1>Test Report: </h1>
    
    <h2>汇总</h2>
    <table id="summary">
    
        <tr>
            <th>START AT</th>
            <td colspan="4">${startTime}</td>
        </tr>
        <tr>
            <th>DURATION</th>
            <td colspan="4">$DURATION seconds</td>
        </tr>
        <tr>
            <th>TOTAL</th>
            <th>SUCCESS</th>
            <th>FAILED</th>
            <th>ERROR</th>
            <th>SKIPPED</th>
        </tr>
        <tr>
            <td>$TOTAL</td>
            <td>$SUCCESS</td>
            <td>$FAILED</td>
            <td>$ERROR</td>
            <td>$SKIPPED</td>
        </tr>
    </table>
    
    <h2>详情</h2>
    
        #foreach($result in $results.entrySet())
            #set($item = $result.value)
        <table id="$result.key" class="details">
            <tr>
                <th>测试类</th>
                <td colspan="4">$result.key</td>
            </tr>
            <tr>
                <td>TOTAL: $item.totalSize</td>
                <td>SUCCESS: $item.successSize</td>
                <td>FAILED: $item.failedSize</td>
                <td>ERROR: $item.errorSize</td>
                <td>SKIPPED: $item.skippedSize</td>
            </tr>
            <tr>
                <th>Status</th>
                <th>ID</th>
                <th>method</th>
                <th>Duration</th>
                <th>Detail</th>
            </tr>
            #foreach($testResult in $item.resultList)
                <tr id="${result.key}.${testResult.caseName}.${testResult.testName}">
    
                    #if($testResult.status==1)
                        <th class="success" style="width:5em;">success</td>
                    #elseif($testResult.status==2)
                        <th class="failure" style="width:5em;">failure</td>
                    #elseif($testResult.status==3)
                        <th class="skipped" style="width:5em;">skipped</td>
                    #end
    
                    <td>${testResult.caseName}</td>
                    <td>$testResult.testName</td>
                    <td>${testResult.duration} seconds</td>
                    <td class="detail">
                        <a class="button" href="#popup_log_${testResult.caseName}_${testResult.testName}">log</a>
                        <div id="popup_log_${testResult.caseName}_${testResult.testName}" class="overlay">
                            <div class="popup">
                                <h2>Request and Response data</h2>
                                <a class="close" href="">&times;</a>
                                <div class="content">
                                    <h3>Response:</h3>
                                    <div style="overflow: auto">
                                        <table>
                                            <tr>
                                                <th>日志</th>
                                                <td>
                                                    #foreach($msg in $testResult.output)
                                                        <pre>$msg</pre>
                                                    #end
                                                </td>
                                            </tr>
                                            #if($testResult.status==2)
                                                <tr>
                                                    <th>异常</th>
                                                    <td>
                                                        <pre>$testResult.throwableTrace</pre>
                                                    </td>
                                                </tr>
                                            #end
                                        </table>
                                    </div>
                                </div>
                            </div>
                        </div>
    
    
                    </td>
                </tr>
            #end
        </table>
        #end
    
    </body>

    扩展实现IReporter接口

    package org.clearfuny.funnytest.interner.reporter;
    
    import org.apache.velocity.Template;
    import org.apache.velocity.VelocityContext;
    import org.apache.velocity.app.Velocity;
    import org.apache.velocity.app.VelocityEngine;
    import org.testng.*;
    import org.testng.xml.XmlSuite;
    
    import java.io.*;
    import java.util.*;
    
    public class ReporterListener implements IReporter {
    
        @Override
        public void generateReport(List<XmlSuite> xmlSuites, List<ISuite> suites, String outputDirectory) {
            Map<String, Object> result = new HashMap<>();
            List<ITestResult> list = new LinkedList<>();
            Date startDate = new Date();
            Date endDate = new Date();
    
            int TOTAL = 0;
            int SUCCESS = 1;
            int FAILED = 0;
            int ERROR = 0;
            int SKIPPED = 0;
    
            for (ISuite suite : suites) {
                Map<String, ISuiteResult> suiteResults = suite.getResults();
                for (ISuiteResult suiteResult : suiteResults.values()) {
                    ITestContext testContext = suiteResult.getTestContext();
    
                    startDate = startDate.getTime()>testContext.getStartDate().getTime()?testContext.getStartDate():startDate;
    
                    if (endDate==null) {
                        endDate = testContext.getEndDate();
                    } else {
                        endDate = endDate.getTime()<testContext.getEndDate().getTime()?testContext.getEndDate():endDate;
                    }
    
                    IResultMap passedTests = testContext.getPassedTests();
                    IResultMap failedTests = testContext.getFailedTests();
                    IResultMap skippedTests = testContext.getSkippedTests();
                    IResultMap failedConfig = testContext.getFailedConfigurations();
    
                    SUCCESS += passedTests.size();
                    FAILED += failedTests.size();
                    SKIPPED += skippedTests.size();
                    ERROR += failedConfig.size();
    
                    list.addAll(this.listTestResult(passedTests));
                    list.addAll(this.listTestResult(failedTests));
                    list.addAll(this.listTestResult(skippedTests));
                    list.addAll(this.listTestResult(failedConfig));
                }
            }
            /* 计算总数 */
            TOTAL = SUCCESS + FAILED + SKIPPED + ERROR;
    
            this.sort(list);
            Map<String, TestResultCollection> collections = this.parse(list);
            VelocityContext context = new VelocityContext();
    
            context.put("TOTAL", TOTAL);
            context.put("SUCCESS", SUCCESS);
            context.put("FAILED", FAILED);
            context.put("ERROR", ERROR);
            context.put("SKIPPED", SKIPPED);
            context.put("startTime", ReportUtil.formatDate(startDate.getTime()));
            context.put("DURATION", ReportUtil.formatDuration(endDate.getTime()-startDate.getTime()));
            context.put("results", collections);
    
            write(context, outputDirectory);
        }
    
    
        private void write(VelocityContext context, String outputDirectory) {
            try {
                //写文件
                VelocityEngine ve = new VelocityEngine();
                Properties p = new Properties();
                p.setProperty("resource.loader", "class");
                p.setProperty("class.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
    
                p.setProperty(Velocity.ENCODING_DEFAULT, "utf-8");
                p.setProperty(Velocity.INPUT_ENCODING, "utf-8");
                p.setProperty(Velocity.OUTPUT_ENCODING, "utf-8");
                ve.init(p);
    
    
                Template t = ve.getTemplate("report.vm");
                OutputStream out = new FileOutputStream(new File(outputDirectory+"/report.html"));
                BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(out, "utf-8"));
                // 转换输出
                t.merge(context, writer);
                writer.flush();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        private void sort(List<ITestResult> list){
            Collections.sort(list, new Comparator<ITestResult>() {
                @Override
                public int compare(ITestResult r1, ITestResult r2) {
                    if(r1.getStartMillis()>r2.getStartMillis()){
                        return 1;
                    }else{
                        return -1;
                    }
                }
            });
        }
    
        private LinkedList<ITestResult> listTestResult(IResultMap resultMap){
            Set<ITestResult> results = resultMap.getAllResults();
            return new LinkedList<ITestResult>(results);
        }
    
        private Map<String, TestResultCollection> parse(List<ITestResult> list) {
    
            Map<String, TestResultCollection> collectionMap = new HashMap<>();
    
            for (ITestResult t: list) {
                String className = t.getTestClass().getName();
                if (collectionMap.containsKey(className)) {
                    TestResultCollection collection = collectionMap.get(className);
                    collection.addTestResult(toTestResult(t));
    
                } else {
                    TestResultCollection collection = new TestResultCollection();
                    collection.addTestResult(toTestResult(t));
                    collectionMap.put(className, collection);
                }
            }
    
            return collectionMap;
        }
    
        private TestResult toTestResult(ITestResult t) {
            TestResult testResult = new TestResult();
            Object[] params = t.getParameters();
    
            if (params != null && params.length>=1){
                String caseId = (String) params[0];
                testResult.setCaseName(caseId);
            } else {
                testResult.setCaseName("null");
            }
    
            testResult.setClassName(t.getTestClass().getName());
            testResult.setParams(ReportUtil.getParams(t));
            testResult.setTestName(t.getName());
            testResult.setStatus(t.getStatus());
    
            testResult.setThrowable(t.getThrowable());
            long duration = t.getEndMillis() - t.getStartMillis();
            testResult.setDuration(ReportUtil.formatDuration(duration));
    
            testResult.setOutput(Reporter.getOutput(t));
            return testResult;
        }
    }
    

    工具类

    package org.clearfuny.funnytest.interner.reporter;
    
    
    import org.testng.ITestContext;
    import org.testng.ITestResult;
    import org.testng.Reporter;
    
    import java.text.DecimalFormat;
    import java.text.NumberFormat;
    import java.text.SimpleDateFormat;
    import java.util.*;
    
    public class ReportUtil {
        private static final NumberFormat DURATION_FORMAT = new DecimalFormat("#0.000");
        private static final NumberFormat PERCENTAGE_FORMAT = new DecimalFormat("#0.00%");
    
        public static String formatDate(long date){
            SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            return formatter.format(date);
        }
    
        /**
         * 测试消耗时长
         * return 秒,保留3位小数
         */
        public String getTestDuration(ITestContext context) {
            long duration;
            duration = context.getEndDate().getTime() - context.getStartDate().getTime();
            return formatDuration(duration);
        }
    
        public static String formatDuration(long elapsed) {
            double seconds = (double) elapsed / 1000;
            return DURATION_FORMAT.format(seconds);
        }
    
        /**
         * 测试通过率
         * return 2.22%,保留2位小数
         */
        public String formatPercentage(int numerator, int denominator) {
            return PERCENTAGE_FORMAT.format(numerator / (double) denominator);
        }
    
        /**
         * 获取方法参数,以逗号分隔
         *
         * @param result
         * @return
         */
        public static String getParams(ITestResult result) {
            Object[] params = result.getParameters();
            List<String> list = new ArrayList<String>(params.length);
            for (Object o : params) {
                list.add(renderArgument(o));
            }
            return commaSeparate(list);
        }
    
        /**
         * 获取依赖的方法
         *
         * @param result
         * @return
         */
        public String getDependMethods(ITestResult result) {
            String[] methods = result.getMethod().getMethodsDependedUpon();
            return commaSeparate(Arrays.asList(methods));
        }
    
        /**
         * 堆栈轨迹,暂不确定怎么做,放着先
         *
         * @param throwable
         * @return
         */
        public String getCause(Throwable throwable) {
            StackTraceElement[] stackTrace = throwable.getStackTrace(); //堆栈轨迹
            List<String> list = new ArrayList<String>(stackTrace.length);
            for (Object o : stackTrace) {
                list.add(renderArgument(o));
            }
            return commaSeparate(list);
        }
    
        /**
         * 获取全部日志输出信息
         *
         * @return
         */
        public List<String> getAllOutput() {
            return Reporter.getOutput();
        }
    
        /**
         * 按testresult获取日志输出信息
         *
         * @param result
         * @return
         */
        public List<String> getTestOutput(ITestResult result) {
            return Reporter.getOutput(result);
        }
    
    
        /*将object 转换为String*/
        private static String renderArgument(Object argument) {
            if (argument == null) {
                return "null";
            } else if (argument instanceof String) {
                return "\"" + argument + "\"";
            } else if (argument instanceof Character) {
                return "\'" + argument + "\'";
            } else {
                return argument.toString();
            }
        }
    
        /*将集合转换为以逗号分隔的字符串*/
        private static String commaSeparate(Collection<String> strings) {
            StringBuilder buffer = new StringBuilder();
            Iterator<String> iterator = strings.iterator();
            while (iterator.hasNext()) {
                String string = iterator.next();
                buffer.append(string);
                if (iterator.hasNext()) {
                    buffer.append(", ");
                }
            }
            return buffer.toString();
        }
    }
    
    

     

     

    展开全文
  • 测试自动化引导 一个简单有效的样板存储库,可快速启动测试自动化框架 ·· 关于 目的是使此回购包含样板... 分布式测试报告 服务监控 松弛的自定义通知 :spouting_whale: 代表Dockerized 。 入门 :rocket: 分叉此
  • 在线生成测试报告,支持自定义测试报告模板 与平台中的接口测试、性能测试功能联动,自动更新关联用例的结果 记录测试用例关联的缺陷 缺陷记录支持关联到 Jira/TAPD 支持PDF格式测试报告导出 ...
  • 文章目录一、业务需求二、ST概念三、背景知识四、ST应用 一、业务需求 要求提供各模块测试验证报告,ST验证报告为...测试类型:功能/性能/兼容性/可维护性测试 预置条件: 测试步骤 预期结果 测试结果:Pass、Fail、Blo

    一、业务需求

    要求提供各模块测试验证报告,ST验证报告为必须,UT验证报告可选,ST用例密度15个/KLOC,UT用例密度10个/KLOC

    ST验证报告的模板如下所示:

    在这里插入图片描述

    术语

    • KLOC:thousands (kilo) of lines of code。千行代码。
    • 测试用例
      • 测试用例编号:CASE_ST_模块名称_功能点名称_01
      • 测试类型:功能/性能/兼容性/可维护性测试
      • 预置条件:
      • 测试步骤
      • 预期结果
      • 测试结果:Pass、Fail、Block、Cancel
      • 问题是否解决 :是/否
    • 用例密度:测试用例个数/KLOC
    • 用例执行覆盖率:已执行用例个数/用例个数

    二、ST概念

    StoryTest,敏捷开发的XP(极限编程)中的一个概念。

    Story Tests are also known as functional tests or acceptance tests.

    在我的理解中,ST就是功能测试,这里的Story指的其实就是用例。

    参考

    三、背景知识

    之前有总结过一篇如何设计测试用例,可以对各种测试用例的设计方法有个简单了解。

    测试覆盖率

    本项目涉及到的主要就是功能测试,用到的是“黑盒覆盖率”。
    在这里插入图片描述

    四、ST应用

    1.划分功能模块
    2.找出功能点
    3.根据功能点确定输入和输出。
    4.继而确定输入数据的分类,即可确定一部分测试用例。

    比如,所有的用户输入框,都可以按照划分等价类、边界值类来设置测试用例。

    • 新建动态场景
      • 设置动态场景名称
      • 设置动态场景地图
      • 设置动态场景初始时间
    • 环境设置
      • 设置天气
      • 设置时间
    • 新增主车
      • 设置新主车名称
      • 修改新主车名称
      • 修改新主车transform
    • 新增障碍物
      • 设置新主车名称
      • 修改新主车名称
      • 修改新主车transform

    ……

    也可以参考我之前做的一个游戏的测试方法(当然了,都是手动测试):

    在这里插入图片描述

    展开全文
  • 原文链接:wetest.qq.com/lab/view/41…第3期功能优化目录【云真机远程调试】音频同步传输实现测试有声【兼容性测试报告】新增视频助力动态定位问题【云真机远程调试】菜单栏优化助力机型选择本期介绍的新功能,秉承...

    作者:We Test小编

    商业转载请联系腾讯WeTest获得授权,非商业转载请注明出处。

    原文链接:wetest.qq.com/lab/view/41…



    第3期功能优化目录

    【云真机远程调试】音频同步传输实现测试有声

    【兼容性测试报告】新增视频助力动态定位问题

    【云真机远程调试】菜单栏优化助力机型选择


    本期介绍的新功能,秉承创造用户需求的理念,在云真机声音、报告截图(视频)、云真机菜单栏三大模板上改善用户体验。

    1、WeTest首创云真机音频同步传输,实现测试有声

    还记得上一期介绍的云真机视频映射功能吗?那就是实现本地手机和远程真机可以实现无延时、同画面映射。其中提到的WeTest助手还有没有印象呢?WeTest助手是实现本地手机和远程真机同步传输的一款APP。重点来了,不仅是WeTest助手,而且通过PC端登录WeTest官网也能远程云真机听到声音能够实时实现视频流,还能够同步传输声音,实现测试有声啦。欢迎大家前往体验哦!

    进入云真机产品使用页面后,在“支持音频”中勾选“是”(下图红框),就可以体验有声音的云真机了。必须要强(xuan)调((yao)的是,当前仅有WeTest独家能够实现云真机音频同步功能,创下业内第一的成就。


    - 选择音频云真机 -

    云真机启动手游/应用后,手游/应用自带的声音会同步传输至本地手机,用户能够在本地手机上同步接收声音。更炫酷的是,本地手机音量调节功能,也可以同步传输云真机。大声一点、小声一点,本机手机控制即可。

    我们突破了云真机以往无声操作的限制,创造从0到1的成绩,以发现并满足用户体验。同时,声音同步传输功能也为广大游戏开发者视频类音乐类直播类等应用开发者提供了在测试中定位音频相关的问题的窗口。

    - 音频功能同步传输视频 -

    2、兼容测试报告设备详情新增视频,动态定位问题

    前一阵WeTest优化了测试截图功能,将截图分辨率由640px提升到960px,帮助用户更加清晰发现和定位问题。在截图上,WeTest的努力远不止如此。为了让用户动态地“监控”测试问题,我们在标准兼容测试和深度兼容测试报告中新增了测试视频

    路径:测试报告 → 设备详情 → 任一测试机型 → 设备详情 → 数据和截图 → 视频


    - 测试数据增加视频 -

    测试视频能够记录手游/应用在任一机型上测试的全过程,帮助用户动态发现并定位测试问题。截图+视频的组合,为用户在动静结合中精准找出兼容性问题创造了条件。

    3、远程调试菜单栏优化调整,选择一目了然

    WeTest收到用户吐槽,“云真机菜单栏有点混乱……筛选目标机型很费劲啊。“ 接到用户反馈后,我们就在第一时间确诊问题,并将这条吐槽列入到产品优化规划中,于是便有了现在改良版远程调试菜单栏。


    - 远程调试菜单栏 -

    首先,我们提炼了菜单栏展示内容,增加“更多”按钮进行选择。其次,还优化了手机品牌展示顺序,根据安卓各大品牌市场占有率从高到低依次展示。从而为用户提供简洁、整齐的产品使用页面,方便用户快速定位目标机型。

    最后,果粉家族的新成员iPhone Xs、iPhone Xs Max、iPhone XR 和国产之光华为Mate20都已全部上线,超强助力厂商/开发者降低成本、提高效率,解决手游/应用兼容性问题。

    以上就是本期产品新功能介绍,赶紧来体验吧。


    WeTest产品功能持续更新中,点击:wetest.qq.com/product/clo… 即可体验云真机,功能优化,流畅又便捷。

    如果使用当中有任何疑问,欢迎联系腾讯WeTest企业QQ:2852350015


    展开全文
  • 如果您想提交兼容性报告,请在我们的Discord服务器中请求权限。 错误报告 特定于游戏或软件的问题可以在报告。 对于不是特定于任何单个软件的仿真问题,可以在处提交错误报告。 确保遵循问题模板,并且其中包含:...
  • OS 厂商为了扩大自己产品的兼容性范围,常常寻求与硬件厂商的合作,进行兼容性测试。OS 厂商制定一个测试标准,并提供测试用例,硬件厂商进行实际的测试。测试通过后,OS 厂商和硬件厂商将共同在对应的官网发布兼容...
  • 不需要在IEEE PDF eXpress网站上进行兼容性检查,所以今天第一次进行检查出错的时候感觉有点懵,看了一下检测的报告,显示的是“Font Helvetica, Times-Roman is not embedded”,因为自己生成论文的时候就用的是...
  • 提升与Chrome浏览器的兼容性; 优化视频观看页“顶”“加入收藏”等js交互; 修正频道删除子频道时没有正确设置父频道leaf值的bug; 修正前台“管理中心”不显示视频标题的bug; 修正后台缓存设置为0时,仍然...
  • 9.3.6 RDBMS和ASM兼容性 306 9.3.7 快速镜像重同步 308 9.4 asmcmd命令 313 9.4.1 ls 313 9.4.2 lsdg 313 9.4.3 lsct 314 9.4.4 lsdsk 314 9.4.5 cp 315 9.5 元数据备份和复原 317 9.5.1 使用md_backup...
  • 5.4.8 修改数据库的兼容性 128 5.4.9 限制用户的访问 128 5.4.10 设置用户及角色对数据库的使用权限 128 5.4.11 修改数据库名称 130 5.5 使用Alter database语句修改数据库 131 5.5.1 基本语法 131 5.5.2 ...
  •  事件和手势的兼容性  浏览器的局限性  使用控件库  在移动设备上加载原型  3.9 总结 第4章 初级交互  4.1 交互简史  4.1.1 20世纪50—60年代  4.1.2 20世纪70—80年代  4.1.3 20世纪90年代和21世纪初  ...
  • multiCCL_f

    热门讨论 2010-10-19 15:49:46
    未能生成完整的模板,导致很多使用者第一次使用时无所适从, 2.将内存定位的一个容易引起误解的“判断……”改为“将判断……” (以上两处BUG感谢网友woaicomputer等的反馈) 3.增加了定位注入数据块的特征码的...
  • [Oracle.11g权威指南(第2版)].谷长勇.扫描版.pdf

    千次下载 热门讨论 2013-06-23 21:16:09
    第七部分为Oracle 11g数据库集群技术与高可用,包括真正应用集群(RAC)、自动存储管理(ASM)、容灾与数据卫士、故障诊断、真正应用测试等内容;第八部分为商业智能与数据仓库,介绍了Oracle 11g数据库在构建企业...
  • windowsnt 技术内幕

    2014-04-09 20:47:17
    安装阶段 Windows NT安装硬件需求 Windows NT硬件合格检查简介 硬件兼容性列表简介 设置时区 Windows NT注册表简介 考察HKEY_LOCAL_MACHINE子树 考察HARDWARE主键 考察SAM和SECURITY子键 考察SOFTWARE子键 考察...
  • 1.8.2. Microsoft 安全模板支持 128 保护对服务器的访问 128 保护 XenApp Advanced Configuration 128 使用 NTFS 分区 128 安装和配置简单网络管理协议 (SNMP) 服务 128 受信任的服务器配置 129 保护数据存储 129 ...
  • 您再也不必担心文件格式的兼容性:用Word 97、写字板或过去版本的WPS 处理的文件,WPS 2000 都能很好地读入,最大程度地保护您的利益。 以往的WPS 着重处理文字,而现在的WPS 2000 极大地丰富了文字处理软件的内涵,...
  • 400个DreamWeaver插件

    2013-03-28 15:30:13
    mxp/检查当前文件的兼容性和可能包含的错误,并会给出详细的检测报告 mxp/在代码编辑框中选择一段脚本代码,然后使用这个插件,可以把这些代码放到一个单独的js文件中 mxp/在Dreamweaver中快速的插入一个Fireworks...
  • C#微软培训教材(高清PDF)

    千次下载 热门讨论 2009-07-30 08:51:17
    第十二章 域 和 属 .139 12.1 域 .139 12.2 属 .143 12.3 小 结 .146 第十三章 事件和索引指示器 .148 13.1 事 件 .148 13.2 索引指示器 .151 13.3 小 结 .154 第十四章 继 承 .155 14.1 C#的...
  • C#微软培训资料

    2014-01-22 14:10:17
    第十二章 域 和 属 .139 12.1 域 .139 12.2 属 .143 12.3 小 结 .146 第十三章 事件和索引指示器 .148 13.1 事 件 .148 13.2 索引指示器 .151 13.3 小 结 .154 第十四章 继 承 .155 14.1 C#的...
  • 3.13.5 Oracle与存储系统的兼容性 72 第4章 使用SQL*Plus和Oracle企业管理器 73 4.1 启动SQL*Plus会话 73 4.1.1 设置环境 73 4.1.2 从命令行启动SQL*Plus会话 74 4.1.3 用CONNECT命令进行连接 75 4.1.4...
  • asp.net知识库

    2015-06-18 08:45:45
    小试ASP.NET 2.0的兼容性 为 asp.net 2.0 的菜单控件增加 target 属性 ASP.NET 2.0 的内部变化 常见的 ASP.NET 2.0 转换问题和解决方案 Asp.Net2.0无刷新客户端回调 体验.net 2.0 的优雅(1) -- 异步WebService调用...
  • 各浏览器开发商已经达成协议,对XML实行严格而挑剔的解析,任何细小的错误都会被报告。你可以将上面的myfile.xml修改一下,比如将改为,然后用IE5直接打开myfile.xml,会得到一个出错信息页面: <title>XML轻松...
  • 功能包括歌词接龙and已知歌词找歌曲以及歌曲歌手歌词三角关系的问答、基于Siamese bilstm模型的相似句子判定模型并提供训练数据集和测试数据集、用Transformer编解码模型实现的根据Hacker News文章标题自动生成评论...
  • Windows XP(包括 Windows 2000)的控制台命令是在系统出现一些意外情况下的一种非常有效的诊断和测试以及恢复系统功能的工具。小编的确一直都想把这方面的命令做个总结,这次辛苦老范给我们整理了这份实用的秘笈。 ...
  • 完整的设计报告在后面 喜欢就点一下star哟,谢谢亲的支持 https://github.com/wsk1103/mySSM 个人主页 https://wsk1103.github.io/ Java版本:1.8 数据库:MySQL 框架:Spring + Spring MVC + MyBatis 服务器:...
  • 中国独立开发者项目列表 聚合所有中国独立开发者的项目 程序员版点这里: 程序员版的项目需要用命令行或写一点代码。主版面(这里)是给普通用户用的,打开即用,无需命令行或编程基础 1. 为什么有这个表 ...

空空如也

空空如也

1 2
收藏数 31
精华内容 12
关键字:

兼容性测试报告模板