1. Trang chủ
  2. » Tất cả

An efficient method for automated regression test data generation for cc++ projects

6 1 0

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề An Efficient Method for Automated Regression Test Data Generation for C/C++ Projects
Tác giả Hoang-Viet Tran, Pham Ngoc Hung
Trường học University of Engineering and Technology, Vietnam National University
Chuyên ngành Information Technology
Thể loại Conference Paper
Năm xuất bản 2021
Thành phố Hanoi
Định dạng
Số trang 6
Dung lượng 180,35 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

An Efficient Method for Automated Regression Test Data Generation for C/C++ Projects An Efficient Method for Automated Regression Test Data Generation for C/C++ Projects Hoang Viet Tran Center of Mult[.]

Trang 1

An Efficient Method for Automated Regression Test

Data Generation for C/C++ Projects

Hoang-Viet Tran Center of Multidisciplinary Integrated

Technologies for Field Monitoring (FIMO)

University of Engineering and Technology,

Vietnam National University, Hanoi, E3 building, 144 Xuan Thuy, Cau Giay, Hanoi, Vietnam thv@vnu.edu.vn

Pham Ngoc Hung Faculty of Information Technology University of Engineering and Technology, Vietnam National University, Hanoi, E3 building, 144 Xuan Thuy, Cau Giay, Hanoi, Vietnam hungpn@vnu.edu.vn

AbstractÐRegression test is a well-known method to ensure

that both unchanged and evolved functions of the evolving

software are in good quality This is known to be an expensive

task even with automated test data generation methods For this

reason, this paper proposes an effective method to maintain and

reuse the test data generation results from previous versions

for regression test of the evolved version The key idea of the

proposed method is that for unchanged units, we can reuse the

whole previous test data For evolved units, we reuse as many

as possible the solutions of the unchanged test path constraints

and generate new test data for only the new or updated test

path constraints The analysis shows that the proposed method

has a high potential of applicability in regression test of C/C++

projects in practice We give discussions about several evolving

scenarios of a given unit and how the proposed method comes

to effective in such scenarios

Index TermsÐtest data generation, C/C++ projects, concolic

testing, dynamic symbolic execution, regression test

I INTRODUCTION Software testing is an important phase in a software life

cycle which accounts for up to 50% of software development

cost [2] This is especially correct when the software is

continuously evolved during the maintenance phase where

bugs are fixed and new features are regularly added The test

which is performed when a software is evolved to ensure that

all its functions work correctly is called regression test As

an obvious result, regression test plays a key role among the

software quality assurance methods However, this is a time

costly and boring task for a manual regression test

Conse-quently, many efforts have been spent on making regression

test an automatic process Although we can use such tool as

Selenium [12] to automatically perform the test, this is not

a fully automated process since the tool does not help us

generate test data automatically For this reason, we need fully

automated methods which can generate test data, run the test

data automatically, and give us the coverage results

There have been many researches on the automated test data

generation method such as CREST [5], KLEE [6], DART [11],

SDART [16], CUTE [17], CAUT [18], and PathCrawler [21],

etc However, all those researches do not mention the

re-gression test in the context of software evolution In case

we simply apply those methods to automatically generate test data when doing regression test, the test data generation cost is still high for real projects in practice In addition, regarding the regression test, there have been many researches published such as the researches of BiczÂo et al [3] and Yoo and Harman [22], etc Although these researches are about the regression test, they focus on another aspect of the regression test problem That is to find a method for effectively select the test cases for doing regression test, not about how to efficiently generate test data and reuse the generated test data throughout the software life cycle Moreover, there are some other methods about automatically generating test data [9], [10], [23] Nevertheless, they focus on other aspects of the problem, not on a simple but effective method of maintaining and reusing the test data set during regression test Duy

et al introduced a method to automatically generate test data for regression test Lustre/SCADE programs using model checking techniques [9], [10] Yoshida et al introduced a novel technique for automated and fine-grained incremental generation of unit tests through minimal augmentation of an existing test suite [23] The techniques of Yoshida et al use the iterative, incremental refinement of test-drivers and symbolic execution, guided by a diagnostics engine In our opinion, these methods have not used of a simple but effective method during regression test That is to maintain and reuse both the test data set and the test path constraints solving results of the SMT-solver when generating test data for evolving projects This paper proposes a method for regression test data generation of evolving C/C++ projects They key idea of the method comes from an observation that in regression test, most units of the projects are unchanged We can reuse the generated test data from previous versions for doing regression test For evolved units, we can reuse the generated test data from previ-ous versions for unchanged test paths By reusing the test data generated from the previous test path constraints solutions, we can save a lot of solving time of the SMT-solver The set of solved test path constraints and their corresponding generated test data is maintained and reused during the software life cycle This will effectively reduce the cost for regression test

Trang 2

data generation of evolving projects A logical analysis shows

that the proposed method can significantly reduce the test data

generation cost when doing regression test in the context of

software evolution Several aspects of the software evolution

and regression test data generation are discussed in the paper

The paper is organized as follows At first, some basic

concepts about the test data generation are briefly described

in Section II Then, the overview of the test data generation

method for C/C++ projects using concolic testing method

is presented in Section III Later, the proposed method is

described in Section IV In Section IV, we give the analysis

about the proposed method and discussions about several

evolving scenarios of a given project Some researches related

to the proposed method are discussed in Section V Finally,

we conclude the paper in Section VI

II BACKGROUND This section presents some key concepts which will be used

in this paper

Definition 1 (Control Follow Graph - CFG ): Consider a

unit function, its corresponding CFG is a directed graph G=

(V, E), where V = {v0, v1, , vn} is a set of vertices and

E = {(vi, vj)|(vi, vj) ∈ V } is the set of its edges The set

of vertices V represents all statements of the unit The set of

edges E is a set of directed edges in which each edge(vi, vj)

represents the corresponding state from vi to vj

A Test path is one of the key concepts in test data generation

methods A test path is a sequence of vertices from the start

to the end vertex of a CFG A test path is formally defined as

follows

Definition 2 (Test path): For a given CFG G = (V, E), a

test path is defined as a path {v0, v1, , vn|(vi, vi+1) ∈ E},

where0 ≤ i ≤ n − 1, v0 and vn are the start and end vertex

of G, respectively

Test path constraintsare the results of a symbolic execution

for a given test path These constraints are converted into an

Lib expression as an input to be solved by an

SMT-solver From the solution of this SMT-solver, the

correspond-ing test data is generated

Definition 3 (Test path constraints): For a given test path

T P of the function f n under test, its corresponding test

path constraints are defined as the following logic expression:

P C = pc0 ∧ pc1 ∧ ∧ pcn−1, where n is the number of

conditions on T P ; pci is a constraint (0 ≤ i ≤ n − 1); pc0

and pcn−1are the path constraints corresponding to the start

and end conditions in T P , respectively

III TESTDATAGENERATION FORTHEFIRSTVERSION

A Concolic Testing

Concolic testing is the combination of Concrete and

Symbolic execution methods The method was first mentioned

by Larson and Austin in 2003 [13] The name ªConcolicº was

proposed by Sen et al in 2005 [17] The overview of concolic

testing method is shown in Figure 1 which contains three

phases marked with their corresponding numbers as follows:

• Phase 1: Initial test data set is randomly generated

Start

Generate test data at random

Execute test data & analyze covered test paths

Uncovered test path exists?

Generate

a new test data

End Initially

generated test data

Generated

Yes

(3)

Fig 1 The overview of concolic testing method.

• Phase 2: Test data generated at Phase 1 and 3 are executed and analyzed to find covered test paths

• Phase 3: If an uncovered test path exists, the method generates a new test data to cover the uncovered test path Otherwise, the test data generation process stops Although many researches have been published using con-colic testing to automatically generate test data for C/C++ projects such as CREST [5], DART [11], CAUT [18], KLEE [6], PathCrawler [21], etc., there exist certain problems These problems are addressed and improved in researches of Nguyen et al [15], [16] In this paper, we do not discuss in details those problems Hereafter, when mentioning concolic testing, we refer to the method proposed by Nguyen et al

to generate test data when testing the first version of C/C++ projects [15], [16] Details of the concolic testing phases are described in the sections below

B Random Test Data Generation

Phase 1 of concolic testing method is to generate an initial test data set at random Then, the initial test data set is passed

to the Phase 2 for execution and further analysis Details of Phase 1 is shown in Algorithm 1

Algorithm 1: Generate the initial test data set Input: f : unit under test

Output: T : the random test data set

1 begin

2 T ← ∅

3 while code coverage <100% do

4 foreach parameter in f do

6 param value← generate a random value for

parameter

10 if code coverage is not increased and

T HRESHOLD is reached then

13 end

14 return T

15 end

In the beginning, Algorithm 1 initializes T with an empty set (line 2) While the code coverage of the generated test data set T is less than100%, the algorithm does the following steps The first step is to generate a new test data at random

Trang 3

(line 4 - 8) Then, the newly generated test data is added to

the test data set T (line 9) Later, the algorithm checks if the

code coverage of T is increased in comparison with that of the

previous step If the coverage is not increased for a continuous

T HRESHOLD times, the algorithm stops the random test

data generation process (line 10 - 12) and returns T (line 14)

In this algorithm, T HRESHOLD is a predefined number

of continuous times where random test data generation cannot

increase the coverage If this T HRESHOLD is reached, test

data generation process needs to move to Phase 2 and Phase 3

to generate test data based on the CFG of the unit under test

C Test Data Execution and Test Path Analysis

In Phase 2, the newly generated test data from Phase 1 and

Phase 3 are executed Then, the execution results are analyzed

to find covered test paths From this analysis, the algorithm

can find an uncovered test path The uncovered test path will

be passed to Phase 3 for a new test data generation Details

of this phase is presented in Algorithm 2

Algorithm 2: Execute newly generated test data and

analyze covered test paths

Input: f : the unit under test; T : test data set

Output: uncovered test path: a new uncovered test path

1 begin

2 Execute newly created test data in T

3 test paths← get all covered test paths

4 uncovered node← find an uncovered node from

test paths

5 uncovered test path← find a test path from root to

uncovered node

6 return uncovered test path

7 end

At first, the algorithm executes all newly generated test data

in T (line 2) The execution results are analyzed to find all

covered test paths test paths (line 3) From test paths, the

algorithm finds an uncovered node uncovered node (line 4)

Then, an uncovered test path uncovered test path from the

root of the unit’s CFG to uncovered node can be found

(line 5) The algorithm returns uncovered test path and

stops (line 6)

D Test Data Generation

The most important phase in concolic testing method is

Phase 3 in which a new test data is generated to cover an

uncovered test path from the previous phase Details of this

phase is described in Algorithm 3

In Algorithm 3, given an uncovered test path,

uncovered test path, the target of the algorithm is to

generate a test data which can cover uncovered test path

The algorithm starts by initializing test data t as N U LL

(line 2) Then, uncovered test path is transformed into

logical constraints, path constraints, which is in forms of

logical expressions (line 3) using symbolic execution Later,

path constraints is solved by an SMT-solver (e.g., Z3

SMT-solver [8]) to get the corresponding solution (line 4) If

solution exists (i.e., is not N U LL), the algorithm generates

a test data t from solution (line 5 - 7) Then, the algorithm returns t and stops (line 8)

Algorithm 3: Generate a new test data Input: uncovered test path: an uncovered test path Output: t: next test data

1 begin

3 path constraints← Symbolic execution for uncovered test path

4 solution← Solve path constraints by an SMT-solver

5 if solution is not N U LL then

6 t← Generate a new test data from solution

7 end

8 return t

9 end

E Discussions

When performing experiments of concolic testing, we have the following observations:

• The speed of the whole test data generation process depends heavily on Phase 3 in which a new test data

is generated

• The speed of the test data generation in Phase 3 depends

on the constraints solving speed of the selected SMT-solver (i.e., Z3 SMT-SMT-solver) This solving speed cannot

be improved in the scope of our research

From the above observations, we can see that the test data generation speed can be improved if we can reduce the number

of times in which test path constraints are solved by an SMT-solver This result can be seen through the experiments of Nguyen et al [16] Sharing the same idea of reducing the number of times in which the SMT-solver is called, if we can store the solving result for later use when the software is evolved, we can save a lot of computational cost This is the key idea of the proposed method in this paper which will be presented in sections below

IV TESTDATAGENERATION FOREVOLVEDVERSIONS

A Changes in Test Data Generation

To reuse the SMT-solver solving results, we store the results

in a dictionary so we can easily retrieve them as needed For this reason, Algorithm 3 needs to be updated to reflect the change Details of the updated algorithm is shown in Algorithm 4

Algorithm 4 accepts an uncovered test path uncovered test path and a constraints dictionary consDic containing all test path constraints and their corresponding test data as inputs The algorithm starts by initializing the test data t with N U LL (line 2) Then, the algorithm does symbolic execution for uncovered test path to generate its corresponding test path constraints path constraints (line 3) If consDic dictionary does not contain the key path constraints (line 4), the algorithm solves path constraints by using an SMT-solver to get the

Trang 4

corresponding solution (line 5) If solution exists (line 6), the

algorithm generates a new test data t from solution (line 7)

Then, the algorithm adds the new pair (path constraints, t)

to consDic (line 8) and returns t (line 13) If consDic

dictionary contains the key path constraints (line 10), the

algorithm gets the corresponding test data t from consDic

(line 11) and returns t (line 13)

Algorithm 4: A test data generation variant

Input: uncovered test path: an uncovered test path

consDic: a dictionary storing test path constraints and their

corresponding test data

Output: t: next test data

1 begin

3 path constraints← Symbolic execution for

uncovered test path

4 if consDic does not contain path constraints key

then

5 solution← Solve path constraints by an

SMT-solver

6 if solution is not N U LL then

7 t← Generate a new test data from solution

8 consDic← consDic ∪ (path constraints, t)

10 else

11 t← get the test data corresponding to

path constraints from consDic

12 end

13 return t

14 end

B The Updated Concolic Testing Method

With the changes presented in Algorithm 4, concolic testing

method is updated as shown in Figure 2

Start

Generate test

data at random

Execute test data & analyze covered test paths

Uncovered test path exists?

Generate a new test data (updated)

End Initially

generated

test data

Generated

Yes

(3) Updated concolic testing

consDic

Fig 2 The updated concolic testing method.

In the updated concolic testing method, for a given version

i of the project under test, for each of its corresponding units,

if the test data of the unit under consideration need to be

generated or updated, its source code is passed to the process

as input The main difference between the updated concolic

testing method and the original method is that the process uses

Algorithm 4 in Phase 3 to generate test data Algorithm 4 uses

consDic when generating the required test data Algorithm 4

either returns an existing test data or generates a new test

data as described in Section IV-A In the end of the test

data generation process, the updated concolic testing method returns the corresponding test data vi

C Automated Regression Test Data Generation Method

The updated concolic testing is integrated in the proposed method to generate test data when doing regression test In this method, the updated concolic testing method is employed

to generate test data for all versions During regression test process, consDic is used to store test path constraints and their corresponding generated test data In addition to reusing the results stored in consDic, the method also updates consDic whenever there are new test path constraints solved by the SMT-solver and the new corresponding test data generated The method is described in Figure 3

End

Generate test data for version 1

Start Code version 1

consDic

Code version 2

Generate test data for version 2

update update

reuse

Code version n

Generate test data for version n

reuse update

Test data v 1

Test data v 2

Test data v n

Fig 3 The method for automated regression test data generation.

In the method shown in Figure 3, at the first time, code version 1 is passed to the method to generate test data version

1 (Test data v1) At the same time, consDic is updated with newly generated pairs of test path constraints and their corre-sponding test data Then, when the project code is evolved to the second version Code version 2 is passed to the method to generate test data version 2 (Test data v2) During this process, consDic is also reused and updated with new pairs of test path constraints and their corresponding test data The process is repeated throughout the life cycle of the software Because this

is a long-lasting process, both Test data vi (where1 ≤ i ≤ n) and consDic must be stored in a type of external memory like

a hard drive

D Discussions

With the method presented in this section, we aim to have

an efficient regression testing method for C/C++ projects The key idea of the proposed method is to reuse both the generated test data and test path constraints solving results from the previous versions as much as possible when testing a new version The more test data we can reuse, the more regression test cost we can save For this purpose, the generated test data corresponding to test path constraints are stored in consDic dictionary Then, consDic will be updated and reused during the regression test process

Trang 5

In regards to the efficiency of the proposed method, let’s

consider possible software evolving scenarios To the best of

our knowledge, there are the following evolving scenarios of

a unit from a version before evolving (version 1) to a new

version after evolving (version 2)

1) Version 1 does not have the corresponding version 2:

This is the case where the unit is removed from the

project We do not need to generate test data for it

2) Version 1 and version 2 are the same Using the proposed

method, we do not need to regenerate test data for it

3) Version 1 and version 2 are different but both of them do

not have any branch or loop statements In this case, we

have only one test path for both versions We can reuse

the test data from version 1 as the test path is already

covered by the existing test data

4) Version 2 does not have the corresponding version 1:

This is the case where the unit is added to the version 2

of the project We need to generate test data for it from

the beginning

5) Version 1 and version 2 are different and both of them

have branch or loop statements In this case, the

pro-posed method will prove its effectiveness where many

test paths can be found Because the two versions are

different, there exists new or updated test paths and

unchanged test paths With new or updated test paths,

we need to generate test data for them However, with

unchanged test paths, we can reuse the path constraints

solving results (i.e., reuse the corresponding test data)

With a real project where there are thousands of units,

the path constraints solving time can be greatly reduced

From the above discussions, we can see that with the

proposed method, among the five evolving scenarios, there

are three scenarios (scenarios 1, 2, and 3) in which we do

not need to regenerate test data for regression test In our

experience, scenario 2 is the most common one in evolving

projects in practice Reusing existing test data can save us a

lot of computational cost In scenario 4, we need to generate

test data no matter what testing method being used as this

is a newly added function The most complex scenario is

scenario 5 where the function has branch or loop statements In

compare with the case where we do not reuse the test data and

test path constraints solving results from previous versions, we

can save much cost and time by reusing them

V RELATEDWORKS

In regards to the test data generation for C/C++ projects,

many researches have been published using the static

test-ing [4], [7], [19], [20], dynamic testtest-ing [1], [14], and concolic

testing [5], [6], [11], [16]±[18], [21]

Because our proposed method is based on concolic testing,

we do not give discussion about other static and dynamic

testing methods Concolic testing, whose name is proposed in

CUTE [17], is the combination of static testing and dynamic

testing In concolic testing, the preconditions of the functions

under test are considered one of the key factors for a good

test data generation However, the researches in CREST [5],

DART [11], and CAUT [18] do not require strict precondi-tions As a result, they cannot generate the minimum number

of test data whilst maximizing the code coverage Later, several researches require rigorous preconditions to increase the quality of the generated test data such as KLEE [6], PathCrawler [21] Although the quality of the generated test data set can be improved, the generation speed is still slow which is a hard problem for the application of concolic testing

to large projects Nguyen et al proposed a method named SDART [16] which can reduce the number of times SMT-solver is called This significantly improve the speed of the test data generation process

The above test data generation methods are different from our proposed method in the following aspects Firstly, those methods are for the test data generation of a given unit, not for the regression test Our proposed method inherits the result of the most recent method (i.e., SDART) proposed by Nguyen

et al [16] Our proposed method is effective for test data generation in regression test by maintaining and reusing both the generated test data set and the test path constraints solving results from previous versions

In addition to test data generation methods, regression test attracts a lot of attentions in the research and industrial communities Considering the most closed researches to our proposed method, there are the researches of BiczÂo et al [3], Duy et al [10], and Yoshida et al [23], etc

BiczÂo et al proposed an automatic framework to manage the regression test suite [3] The method of BiczÂo et al contains two main contributions The first one is a new interpretation

of reliable test cases whilst the second one is a dynamic forward impact analyzer method This analyzer method eases the transformation of existing tests to meet the definition of reliability

From 2013 to 2015, Duy et al proposed a method to gen-erate test data for regression test using model checking tech-niques [9], [10] The method was applied to Lustre/SCADE programs The key idea of the method is to determine the minimum number of test cases, which can detect all possible errors Duy et al.’s method also defined the correlation between requirement specification and test cases For this reason, the method can find which test cases should be removed, reused, or created based on the changes of the requirement specification

In 2016, Yoshida et al introduced an automatic technique for fine-grained incremental generation of unit tests through minimal augmentation of an existing test suite [23] This techniques employs the iterative, incremental refinement of the testing process related information such as test-drivers and symbolic execution The process is guided by a diagnostics engine The method attempts to keep the number of lines of newly generated test code minimum Then, the method creates tests for modified code by copying and minimally modifying,

as many as possible, existing tests instead of creating new ones

The above methods presented in researches of BiczÂo et

al [3], Duy et al [9], [10], and Yoshida et al [23] are

Trang 6

different from our proposed method in several key points.

Firstly, the method proposed by BiczÂo et al [3] is about test

case selection for doing regression test effectively whilst our

proposed method is about test data generation for regression

test Secondly, the method proposed by Duy et al [9], [10]

uses model checking to generate test cases and employs the

correlation between requirement specification and test cases

to which test cases are removed, updated, or created In the

meantime, our proposed method bases on concolic testing

and directly uses the source code to decide which test data

should be removed, reused, or created Last but not least,

the method proposed by Yoshida et al [23] focuses on the

changed lines of code to modify the corresponding test cases

This method does not base on test path constraints to decide

if a test case can be reused In our opinion, test paths

and their corresponding constraints are better bases for test

data generation which ensure the required coverage of every

unit functions In addition, our proposed method focuses on

maintaining and reusing both the generated test data and the

test path constraints solutions from previous versions

VI CONCLUSION

We have proposed an efficient method for generating test

data when doing regression test of evolving C/C++ projects

The key idea of the method is to store the test path constraints

and their corresponding test data in a dictionary The test data

stored in this dictionary can be reused when doing regression

test of the evolving projects This dictionary is also updated

during the regression test to keep it up to date The logical

analysis of the possible evolving scenarios shows that the

proposed method has a great potential applicability when

testing real projects

We are in a progress of implementing this proposed method

so it can be applied in practice To show the effectiveness of

the method, we will perform experiments with several projects

and get real experimental data for analysis such as the required

time, memory, the number of generated test data, and code

coverage when doing regressing test In addition, we need to

provide a tool implementing the proposed method for both

industrial and research community so it can be widely applied

in practice

ACKNOWLEDGMENTS This work has been supported by VNU University of

Engineering and Technology under project number CN21.18

REFERENCES [1] S Anand, E K Burke, T Y Chen, J Clark, M B Cohen,

W Grieskamp, M Harman, M J Harrold, and P Mcminn An

orchestrated survey of methodologies for automated software test case

generation J Syst Softw., 86(8):1978±2001, Aug 2013.

[2] B Beizer Software Testing Techniques John Wiley amp; Sons, Inc.,

USA, 1990.

[3] M BiczÂo, K PÂocza, I ForgÂacs, and Z PorkolÂab A new concept of

effective regression test generation in a c++ specific environment Acta

Cybern., 18(3):481±501, Jan 2008.

[4] G Buckle Static analysis of safety critical software (techniques, tools,

and experiences) In F Redmill and T Anderson, editors, Industrial

Perspectives of Safety-critical Systems, pages 150±168, London, 1998.

Springer London.

[5] J Burnim and K Sen Heuristics for scalable dynamic test generation In

2008 23rd IEEE/ACM International Conference on Automated Software Engineering, pages 443±446, 2008.

[6] C Cadar, D Dunbar, and D Engler Klee: Unassisted and automatic generation of high-coverage tests for complex systems programs In

Proceedings of the 8th USENIX Conference on Operating Systems Design and Implementation, OSDI’08, page 209±224, USA, 2008 USENIX Association.

[7] B Chess and J West. Secure Programming with Static Analysis Addison-Wesley Professional, first edition, 2007.

[8] L de Moura and N Bjùrner Z3: An efficient smt solver In C R.

Ramakrishnan and J Rehof, editors, Tools and Algorithms for the Con-struction and Analysis of Systems, pages 337±340, Berlin, Heidelberg,

2008 Springer Berlin Heidelberg.

[9] T C Duy, N T Binh, and I Parissis Automatic generation of test

cases in regression testing for lustre/scade programs Journal of Software Engineering and Applications, 6(10A):27±35, 2013.

[10] T C Duy, N T Binh, and I Parissis A regression testing approach for lustre/scade programs SoICT 2015, page 288±295, New York, NY, USA, 2015 Association for Computing Machinery.

[11] P Godefroid, N Klarlund, and K Sen Dart: Directed automated

random testing In Proceedings of the 2005 ACM SIGPLAN Conference

on Programming Language Design and Implementation, PLDI ’05, page 213±223, New York, NY, USA, 2005 Association for Computing Machinery.

[12] https://www.selenium.dev/ Selenium https://www.selenium.dev/, 2021 Online; accessed 13 November 2021.

[13] E Larson and T Austin High Coverage Detection of Input-Related Security Facults, page 9 USENIX Association, USA, 2003.

[14] G J Myers and C Sandler The Art of Software Testing John Wiley

& Sons, Inc., Hoboken, NJ, USA, 2004.

[15] D.-A Nguyen and P N Hung A test data generation method for

c/c++ projects In Proceedings of the Eighth International Symposium

on Information and Communication Technology, SoICT 2017, page 431±438, New York, NY, USA, 2017 Association for Computing Machinery.

[16] D.-A Nguyen, T N Huong, H V Dinh, and P N Hung Improvements

of directed automated random testing in test data generation for c++

projects International Journal of Software Engineering and Knowledge Engineering, 29(09):1279±1312, 2019.

[17] K Sen, D Marinov, and G Agha Cute: A concolic unit testing engine

for c In Proceedings of the 10th European Software Engineering Con-ference Held Jointly with 13th ACM SIGSOFT International Symposium

on Foundations of Software Engineering, ESEC/FSE-13, page 263±272, New York, NY, USA, 2005 Association for Computing Machinery [18] Z Wang, X Yu, T Sun, G Pu, Z Ding, and J Hu Test data generation for derived types in c program. In 2009 Third IEEE International Symposium on Theoretical Aspects of Software Engineering, pages 155±

162, 2009.

[19] N Ward The static analysis of safety critical software using malpas.

IFAC Proceedings Volumes, 22(19):91±96, 1989 IFAC/IFIP Workshop

on Safety of Computer Control Systems 1989 (SAFECOMP ’89), Vienna, Austria, 5-7 December.

[20] B Wichmann, A Canning, D Clutterbuck, L Winsborrow, N Ward, and W Marsh Industrial perspective on static analysis. Software Engineering Journal, 10:69 ± 75, 04 1995.

[21] N Williams, B Marre, P Mouy, and M Roger Pathcrawler: Automatic generation of path tests by combining static and dynamic analysis In

M Dal Cin, M Kaˆaniche, and A Pataricza, editors, Dependable Com-puting - EDCC 5, pages 281±292, Berlin, Heidelberg, 2005 Springer Berlin Heidelberg.

[22] S Yoo and M Harman Regression testing minimization, selection and

prioritization: A survey Softw Test Verif Reliab., 22(2):67±120, Mar.

2012.

[23] H Yoshida, S Tokumoto, M R Prasad, I Ghosh, and T Uehara Fsx: Fine-grained incremental unit test generation for c/c++ programs In

Proceedings of the 25th International Symposium on Software Testing and Analysis, ISSTA 2016, page 106±117, New York, NY, USA, 2016 Association for Computing Machinery.

Ngày đăng: 18/02/2023, 05:29