【测试理论基础之DFX测试/精准测试/专项测试/混沌测试】

DFX测试:


DFX是面向产品生命周期各环节的设计,其中X代表产品生命周期的某一个环节或特性,它是一种新的设计技术,在设计阶段尽可能早地考虑产品的性能、质量、可制造性、可装配性、可测试性、产品服务和价格等因素,对产品进行优化设计或再设计。
在软件测试领域除了基本的功能测试外,使用比较多的针对DFX测试主要有:性能测试、可靠性测试、安全测试、可服务性测试等,而这些性能测试,可靠性测试,安全测试,可服务性测试这些测试统称为专项测试。简单一句话,非功能性测试基本都属于专项测试。


精准化测试:


精准测试是指针对性地对开发代码的变更点以及变更关联点做测试。
通过精准测试辅助工具,建立代码和测试案例之间的映射关系,识别代码更新部分,通过关联数据库,反推适用的测试用例,划分测试范围,做到适量覆盖测试即可;
工具:后端适用Jacoco,前端适用Istanbul-middleware.
精准测试可以分为三个维度:差异化,调用链,覆盖率。
在实际的实现中,一般是通过一些高效的算法和工具,来收集并分析测试过程(包括黑盒测试)中产生的数据,然后建立起功能测试和代码层面的关联,并可以识别出未覆盖的测试点,提高测试覆盖率和测试效率
1.精准测试的独特性
精准测试的核心组件包含的软件测试示波器、用例和代码的双向追溯、智能回归测试用例选取、覆盖率分析、缺陷定位、测试用例聚类分析、测试用例自动生成系统,这些功能完整的构成了精准测试技术体系。精准测试系统的本质是一套强大的计算机测试辅助分析系统,它的关键技术是测试用例和代码的双向追溯技术,通过该项技术,很多高级测试算法得以应用同时将测试和开发进行非常紧密的连接。精准测试系统并没有取代人工设计用例、执行用例的过程,但是通过对该过程深入到代码层的分析,可以相当大的程度改进人工测试所产生的各种问题。精准测试因为不改变原有的测试流程,这使得它在手工或者自动化测试中都能使用,例如:精准测试产生的数字化测试数据对整个自动化测试过程可以进行深入跟踪和分析,精准测试的分析降低了自动化测试人为的干预度,使得自动化测试更加智能。
2.精准测试对于源代码的保障
精准测试为了保证源码安全性,采用了对代码进行插装的技术,插桩后打包的应用给测试人员,完全杜绝了测试人员或用户触碰代码的机会,在测试分析过程中如需要源码,只需在本地有源码的环境中与测试数据所记录的数据库匹配,就能实现无缝对接。
3.精准测试怎么做到精准
精准测试是基于代码级别的黑盒测试,并且可以达到白盒级的覆盖率测试。通过测试示波器技术,精准记录黑盒测试用例对应的代码逻辑,实现测试用例到代码逻辑的精准记录和双向追溯;精准的代码级的缺陷定位和崩溃分析;精准的测试充分度分析。所有测试数据均是在测试执行过程中由软件自动分析并录入的底层代码运行数据,数据没有办法伪造和篡改,真实记录测试现场的情况,并基于这些可信的数据给出可信的测试结果。
4.精准测试自动化测试用例时怎么实现的,怎么完成覆盖各种场景
自动化测试用例是指函数级别,自动生成测试框架,针对c/c++语言,制定函数后可自动对函数的参数进行解析(包括指针,数组,结构体以及嵌套结构等)生成可完成被测试函数的参数赋值和调用的驱动框架,并随即填充基础数据类型。驱动程序和被测试程序一起编译后运行,可获得动态覆盖率信息。下一步的版本支持智能的测试用例搜索,除了自动生成测试驱动框架外,可智能的生成遍历所有分支的测试输入以及输出。
5.精准测试怎么实现测试用例和代码关联
关联代码只需要在测试阶段通过测试示波器就可以关联,例如当将开始运行用例的时候开启示波器进行记录,用例执行完毕后结束,就可以将一个阶段的代码运行数据和测试用例关联上。后期是实现所有测试用例和代码的双向关联和追溯。

专项测试:


专项测试:对某个模块、某个功能、某项性能内等进容行的专门的针对性的全面的测试
DFX测试主要有:性能测试、可靠性测试、安全测试、可服务性测试等,而这些性能测试,可靠性测试,安全测试,可服务性测试这些测试统称为专项测试。简单一句话,非功能性测试基本都属于专项测试。
专项测试是为了发现某一些问题而专门设计的测试活动,是为了发现某一类型的产品缺陷专门设计的。对于瀑布模型的软件开发流程,一般在集成测试阶段开展专项测试。敏捷团队各个团队组织形式不同,根据各个团队情况开展。
根据前面的说明,现有DFX里的产品明确要求、后有我们的专项测试。所以这个专项里的知识和技能也是需要积累和学习的。不是随便组织个测试就叫专项测试了。首先需要了解对应的领域知识,比如性能,安全,交互性设计等。了解了领域知识才能有针对性测试。

常见的apk专项测试,主要有几类(主要指项目中经常用到的)
1、稳定性
2、安全性
3、兼容性
4、版本升级
5、流量测试
6、Crash问题(死机);
7、设备兼容问题;
8、流量占用率的问题;
9、App在整个电量的占用比问题;
10、App在不同的网络环境下,白屏问题。
流量测试、电量测试、弱网测试。

混沌性测试:


混沌测试是一种可试验的、基于系统的方法来处理大规模分布式系统中的混乱问题。通过不断试验,了解系统的实际能承受的韧性边界并建立信心,通过不同的试验方法和目的,观察分布式系统的行为和反应。一句话——以试验的方法尽早揭露系统弱点。
混沌测试类似于“故障演练”,不局限于测试,而更像是工程实践。为什么这么说,通常的测试用例会有“期望结果”和“实际结果”,通过将两个结果比较,或者对用户行为的预期,来判断测试通过或失败。而混沌试验类似于“探索性测试”,试验本身没有明确是输入和预期结果,通过对系统和服务的干预,来观察系统的“反应”。将混沌测试原则融入在试验过程中:在生产环境小规模模拟系统故障并定期自动化执行试验,通过试验结果与正常结果进行比对,观察系统“边界”。
生产环境中运行的分布式系统,难免会有各种难以预料的突发事件发生。同时,云原生的发展,不断推进微服务进一步解耦;不断增长的数据和用户规模促使基础设施向大规模分布式演进。分布式系统天生有着各种相互依赖,可以出错的地方数不胜数,处理不好就会导致业务受损,或者是其他各种无法预期的异常行为。
在复杂的分布式系统中,无法阻止这些故障的发生,应该致力于在这些异常行为被触发之前,尽可能多地识别风险。然后,针对性地进行加固,防范,从而避免故障发生时所带来的严重后果。
混沌测试正是这样一套通过在生产分布式系统上进行实验,主动找出系统中的脆弱环节的方法学。这种通过实证的验证方法显然可以为我们打造更具弹性的系统,同时让我们更透彻的掌握系统运行时的各种行为规律。我们能够在不断打造更具弹性(弹性:系统应对故障、从故障中恢复的能力)系统的同时,树立运行高可用分布式系统的信心。
两款工具
1、Chaos-mesh
Chaos Mesh 是一个开源的云原生混沌工程平台,提供丰富的故障模拟类型,具有强大的故障场景编排能力,方便用户在开发测试中以及生产环境中模拟现实世界中可能出现的各类异常,帮助用户发现系统潜在的问题。Chaos Mesh 提供完善的可视化操作,旨在降低用户进行混沌工程的门槛。用户可以方便地在 Web UI 界面上设计自己的混沌场景,以及监控混沌实验的运行状态。
2、ChaosBlade
ChaosBlade 是一款遵循混沌工程实验原理,建立在阿里巴巴近十年故障测试和演练实践基础上,并结合了集团各业务的最佳创意和实践,提供丰富故障场景实现,帮助分布式系统提升容错性和可恢复性的混沌工程工具。

  • 2
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用Crypto++库中的RSA类来导入RSA公钥/私钥的字符串表示。下面是一个简单的示例代码: ```c++ #include <iostream> #include <string> #include <cryptopp/rsa.h> #include <cryptopp/base64.h> using namespace CryptoPP; int main() { // RSA keys in PEM format std::string publicKeyPEM = "-----BEGIN PUBLIC KEY-----\n" "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvRJ9YmJ9A0seV0bSf+I6\n" "n5i6dF6qXl5Hf8b0KJvJ7eN0yTnE4t5rKQYdM+DLg1yXz+4kWv8xgJxJW9Q2gY7L\n" "wNqROnFJZrOq6zZVrWXfR4gWVv8grl2PZl6vQfGbdzPd2BhLW1QOyPZfGy1CCoMg\n" "FQd6ZqBx1UJHsUSx/PnV0i35S8zO7Zq9UxOYbRr9SiCsTJ0FNLwPz7CkC5u3VJ5D\n" "z5z2K7U0fGkO+8fOc5Qv2JUqKd6sN2oT+18+eVf/lvtlQ4U3aXyKZB7u0k8T3xKx\n" "3J2r3x4y+o9B3fz1aV0R/5N5Iz2Kt6gJyJmJyNfh0T+D5JLZL8o+Oq8rD8/8mLgV\n" "XQIDAQAB\n" "-----END PUBLIC KEY-----\n"; std::string privateKeyPEM = "-----BEGIN PRIVATE KEY-----\n" "MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQCuN1Qa1iRQ9ZvZ\n" "iFfZjzKfKXk9X5Rq8Dp4CCVt1LJbXG8oU1Kd7UeJb+JyQrK+D1hViDUKvC4pDvZL\n" "7Wv8wzZ1mJN+3M+Vc7dqSaTr0z+U4d3ZKQKj1UjF9/3Ud/HXw6Ez84Zx5fX1U7P\n" "3u9Qo+6g0cva0tYcZ8E4m8osjzOZn3n5Z+qoDZ2IuoktDjQOdT7vZJc7JmLQ+6U\n" "Gyf8B4j0c6V7iJ0oqOeq27m2xY6xu9gKwDvZl9zJrFv6f9JQy6yY5ZjXVItK8o+\n" "x3DfX+eD8XO7Z0f1wO3J5lXgBuJop4B3PzZPmZw3jwN3LZwU7hAqjWQvLj5r+DqR\n" "KwvS6TJnAgMBAAECggEBAJv9zZ1N9sN7E+gTt9y/7xFG2PjgB9VjYWg6bd4QKpRq\n" "zGJNj2n8q6k8l7k2uT6sRcO5RhS8bQpO4iLl3GJXZr5kjC0Z/1kE1p4H8Y9e5bDh\n" "gNl3ZnK3Wpli8q7KqUjOY8j6Ktj7+vZnT3sW6v/qpIbQgBn7d3q0qsqzjTm8c5f\n" "V3JzUJqkVJqX1mJmJd6tZslpO8mJyZL/vkC4KszkQeE8xKu6sIiA4r6l5e0+OJ8M\n" "8XmXhV8D8ZcHgKvq7qrBvFq5Xv2mHsLdQO+J7uNLC3iQzY3u4jB6Gk8fN7N3e3jv\n" "dDmf8P0l7dOj6q5sZtqoK6fJjW+PcVnC8KzXUy4YrtkCgYEA3g9W5c7J8KmX3xSU\n" "2p/7VfGzBYC7J1Ll1fz4qWf3XZ2VQF7q6yRrA5X+H2GkZiB3vL8/3gOeO3WuGnI0\n" "bJr1lOY9xMvQj7a6KdC5h4Wvmt3qqh6VdQw7dFx8fJ8x5RQwReOuyZ9nEE5Vf+en\n" "cRg9Uk9LQl3rZ4cazH7c+Lkrj2ECgYEAzL4u8eJ5gCpUvJZJyCmlrJX0GryL1wzE\n" "5zO8m1tjwg1YONyJvR4g4bd7p+56q6v3wTzoumH6x3AWDZC8Z6Jr6i4a8+cnl+9M\n" "P+Jr5Lr2fN2Y7w3dFzHhY5NIR0ZxTQJdC5Jp+el1+Kg2y4eFJZpQz0ueH2Jy6wuz\n" "zqJUQY2RmXUCgYEAwYjQg1FnKPGvJlRrXwL9cO4I3W0gx/kD+LpT8aEguJlRf4uS\n" "ZyN8a+xLZbGzWc5wKT9z3whYf4fXf4aFh2U+ZQzXG7yUa5KdNf7xvP8QXa6omQY0\n" "sQO2e1+Vc1r7h2e0HNY0U6E0g+7l7MBZv5lZP6XG7HdY5k8n1UdbvR9uGkECgYEA\n" "xAIlWc+0qLQUjY7t2sqHjzJ3nV2GxMvW0G9fZgD6loQWtKX2Y7r/x6WLZ9Smc5ZQ\n" "4QJ1l0sT1q2YKqCwR1u+2J9lX8Pp17FZK8Xvq8kPT9lQK9o3+JvUqPvX6xrmJ2mK\n" "R7uxvYv+ZzL2R9gkt/6g1QH0aRZzZj0+6+J5PfWen9sCgYEA7fQxJYJdQdUgJvZL\n" "gH2Y1o5LJ5W1N3v9zQJLJGJ1Tt7TfB3gXzOzL/hsW68Uzr+1JqP6e9LTk5OuWVQG\n" "yR7zFv3p6K5tqT2Z0OJdS4xVw/2zB5YzJiK6I6b5aMZr9o2ZtW/0A1m5RcU6bJSo\n" "Vz5Q5O1ZoD7JdS3d+6iNq+f8dQ==\n" "-----END PRIVATE KEY-----\n"; // Base64 decode the PEM strings std::string publicKeyStr, privateKeyStr; StringSource(publicKeyPEM, true, new Base64Decoder(new StringSink(publicKeyStr))); StringSource(privateKeyPEM, true, new Base64Decoder(new StringSink(privateKeyStr))); // Load the keys from the decoded strings RSA::PublicKey publicKey; RSA::PrivateKey privateKey; StringSource(publicKeyStr, true, new PEMDecoder(new StringSink(publicKey))); StringSource(privateKeyStr, true, new PEMDecoder(new StringSink(privateKey))); return 0; } ``` 在这个示例中,我们将PEM格式的RSA公钥/私钥字符串进行Base64解码,然后使用Crypto++库中的PEMDecoder类将它们加载到RSA::PublicKey和RSA::PrivateKey对象中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值