Test Driven Development for Embedded Software
|
|
|
- Johnathan Butler
- 10 years ago
- Views:
Transcription
1 Test Driven Development for Embedded Software James Grenning San Jose, April 2007, ESC Class# 241 Did you write any code this week? Raise your hand. Do you know if your code works? If you are like the hundreds of people I have asked that question to, your hand is probably down right now. What about those of you with your hand still up, how do you know? My guess is that you either have comprehensive automated unit tests for your code, or you are deluding yourself. Are you confident that you did not introduce any side effect defects in the code written this week? With automated tests you could be right. Without the automated tests you can t be so confident. Embedded systems expert Jack Ganssle says The only reasonable way to build an embedded system is to start integrating today The biggest schedule killers are unknowns; only testing and running code and hardware will reveal the existence of these unknowns. [GANSSLE] Jack goes on to say that Test and integration are no longer individual milestones; they are the very fabric of development. This paper is about a way to weave test and integration into the fabric of development. It s called Test Driven Development. Test Driven Development is a practice that concurrently develops automated unit and acceptance tests and the working code that satisfies those tests. This technique was developed in the Smalltalk community by Ward Cunningham, Kent Beck and others. Can embedded developers successfully adopt this practice for embedded software? If you ask me the answer is yes. This paper describes how to use TDD for embedded software development. TDD is often used in Agile development, please see my other paper on Agile Development. [GREN-AGL] Development and Execution Environments Embedded software development brings along a few additional challenges. The development environment usually differs from the target execution environment. Development systems are usually standard off the shelf products. Target systems are custom, limited in availability, expensive and usually shared by the development team members. As you know, the target is often new and untried hardware, possibly still in the prototype shop. I ve seen hardware prototypes costing over $1 million. Not every software engineer will get one of these babies. This means sharing; and sharing means waiting. Waiting kills productivity. Even with access to target hardware, development time is slowed whenever we test on the target. Downloading and running in the target takes time, and it s a difficult and expensive environment to debug in. Testing in the target is necessary, but not always possible or practical. Fortunately, there is an alternative to executing in the target. I run most of my code in my development
2 environment using automated unit and acceptance tests. The cost for doing this is low and I think it is paid for many times over as compared to testing strictly in the target. Test Driven Development Cycle Test Driven Development is a state-of-the-art software development technique that results in very high test coverage and a modular design. Kent Beck, author of Test-Drive Development by Example [BECK] describes the TDD cycle as: 1. Quickly add a test 2. Run all the tests and see the new one fail 3. Make a little change 4. Run all the tests and see the new one pass 5. Refactor to remove duplication This cycle is designed to take only a few minutes. Code is added incrementally. Every few minutes you find out if the code you just wrote is doing what you thought it would do. The tests are automated. All tests are re-run with every change. Tests are a reflection of the code, so tests serve as executable documentation. They are examples of how to use the code. Automated tests and TDD are really important for finding side effect defects. You know those annoying little bugs that you chase for days on end long after the code was developed just because you made a bad assumption a couple months ago. When practicing TDD this is not uncommon Add a new test. Figure out how to make it pass. Add the code; make that modification based on your best information and knowledge. Run the tests. The new test passes But a few previously passing tests now fail. What happened? You violated some earlier assumption. Fortunately, instead of keeping that assumption in your head, or in some document, it was coded in your tests. So the code keeps you from violating your previous assumptions. The code tells you when it is broken. Without the automated tests, you have a good chance of injecting a bug with any change. That bug might be found later in some test activity if you are lucky. If you aren t lucky, the bug will be found by your customer and do damage in a live environment. The bug will be more difficult to find because it will have been days, weeks, or months since it was injected. Having the code tell you when it is broken is very powerful, and can save a lot of time. With well designed automated tests you have a good chance of finding the problem quickly. You will have cause and effect isolated. Back out the change and see the test TDD for Embedded Software 2 of 15
3 pass, then put the change back and see it fail. Then you must find a change that keeps all tests passing. One thing that is not tolerated is broken unit tests. New behavior is not added unless it does not break existing behavior. This cycle is very powerful. It s a feedback loop. Every change is like an experiment. Make a change and then confirm behavior. It has saved me and others many hours and days of debug time; more than paying for the investment in test code. TDD forces each module to be testable in isolation. This isolation means that the design must be modular and loosely coupled. Loose coupling is a desirable quality of software systems, as it makes them easier to understand and change. In Object Oriented languages loose coupling is achieved by using Interfaces to decouple the parts of the system from each other. If you are working in C you can adopt conventions that mimic the interfaces of OO, although you ll get very little help from the language. TDD and Embedded I ve heard that TDD can t be used for embedded. Reasons cited are We have hardware dependencies We have real time constraints We have limited memory We can t use an OO language Despite these complaints the rapid feedback cycle of TDD can, in fact, be used by embedded developers. I know because my colleagues and I are doing it. The issues above do present some unique problems; but there are creative solutions that resolve them. To use TDD you must develop a testable design and hardware dependencies must be managed. The design must be structured so that most of the system s modules can be run in both the target, and the development system. Embedded developers find themselves in these situations: There is no target hardware, its under development. There is a prototype, but the hardware guys are using it and the only available slot is next Friday at 10:45 PM. There s an evaluation board, with none of the specialized IO. The final hardware becomes available just as the product is due to ship next week. Is it safe to say we have some challenges? I d say so. However, embedded developers can mitigate the risk of limited access to hardware by designing the code so that it runs in multiple execution environments. We have to be able to run our tests in the development platform so that when hardware is finally available to us, we can verify operation, and hopefully not have many remaining problems to find. We get a bonus from this too, platform independence; a good thing even if we were not doing TDD. TDD for Embedded Software 3 of 15
4 What do these tests look like? Consider a home security system named HOME GUARD. One of the unit tests in the system is designed to assure that the system is in the right state after power on initialization. This test is concerned with the state of the front panel object and the phone object. If initialization is meeting its requirements the system will not be generating any audible or visual alarms at power up. It won t call the police, it will have the word READY in the front panel display. Running this test with the actual target hardware would require a manual step, or some pretty expensive instrumentation. To avoid this in the example below, the panel and the phone are test stubs, also known as Mock Objects. [MACKINNON] The Mock Objects stand in for software that knows how to manipulate the hardware. The stand-ins have no knowledge of the hardware. They just implement the same interface as the hardware dependant code and remember what they have been told to do so our test can verify they were given the right instructions. This test is written in C++ using CppTestTools [CPPTEST] Not shown is the system setup that the test harness controls in SetUp and TearDown functions. In SetUp the system is initialized, associating the test stubs with the core of the security system. TEST(HomeGuard, PowerUp) CHECK(false == panel->isarmed()); CHECK(false == panel->isaudiblealarmon()); CHECK(false == panel->isvisualalarmon()); CHECK("READY" == panel->getdisplaystring()); CHECK(true == phone->isphoneidle()); Tests have to pass or fail. There is no almost. They are a series of Boolean checks. A project may be made up of hundreds or thousands of tests like this simple example. Don t let those numbers scare you. The tests get written one at a time. When a test is written, the code is written to make that test pass, hence the name Test Driven Development. Code is developed incrementally. All the time making sure the automated tests pass. When the unit tests are run with passing tests you get output that looks like this OK (79 tests, 78 ran, 123 checks, 1 ignored, 0 filtered out) If there is a failure you get pointed right to the failing test like this TDD for Embedded Software 4 of 15
5 Failure in TEST(HomeGuard, ConfigurationDownload) HomeGuardTest.cpp(64) expected <COMMUNICATION PROBLEM EXISTS> but was <COMMUNICATION PROBLEM EXITS> Here is what the same test might look like when programmed in C. TEST(HomeGuard, PowerUp) CHECK(false == mockpanel_isarmed()); CHECK(false == mockpanel_isaudiblealarmon()); CHECK(false == mockpanel_isvisualalarmon()); CHECK("READY" == mockpanel_getdisplaystring()); CHECK(true == mockphone_isphoneidle()); Note that this suggests structuring C code in an Object Oriented way. The interface to the panel and phone are defined in header files. The real panel implements those functions, as does a mock version of it. When creating the test executable you link in the mock versions, when linking for production you link in the real implementations. What does the design look like? The core of Home Guard talks to the hardware through the two interfaces. In C++ an interface is defined as a class with pure virtual functions. In C an interfaces is represented in a header file, with function prototypes for interface functions. For testing mock implementations are used. The real implementations are used for a full product build. In C++ the linker can be used or dynamic binding to select mock vs. real implementations. In C we would most likely use the linker to select the desired implementation. Home Guard Application Core <<interface>> Front Panel +DisplayMessage() +ArmedLedOn() +ArmedLedOff() <<interface>> Phone Dialer TDD for Embedded Software 5 of 15
6 This design improves the Home Guard software platform independence. Tests run on the development system or the target system. The hardware dependencies have to be isolated through interfaces with stubs, or faked-out implementations used for testing. That topic is covered in detail in another paper Progress before hardware [GRENNING]. Embedded TDD Cycle Executing tests on the development system is both a risk and a risk reduction strategy. It is risk reduction, because we are proving the behavior of the code prior to execution in the target. It is a risk because the target and the development platform compilers may have different capabilities, implementations, and bugs. Prior to target availability we risk using compiler features that are not supported by the target compiler. To mitigate this risk we add another step to the embedded TTD cycle: periodically compile with the target s cross-compiler. This will tell us if we are marching down a path towards porting problems. What does periodically mean? Code written without being compiled by the target s compiler is at risk of not compiling on the target. How much work are you willing to risk? A target cross-compile should be done before any check in, and probably whenever you try out some language feature you have not used before. Your team should have an agreed upon convention. It would be a shame to use some C++ feature only to find that the target compiler does not support it. Once target hardware is available, we ll continue to use the development systems as our first stop for testing. We get feedback more quickly and have a friendlier debug environment. But, testing in the development environment introduces another risk: execution may differ between platforms. To lessen this risk we ll periodically run the unit tests in the prototype. This assures that the generated code for both platforms behaves the same. Ideally the tests are run prior to check-in. You should consider how much of your work is being risked by not getting the feedback from running tests in the target. Keep in mind that if you have limited memory in your target, tests may have to be run in batches. With target hardware available you should add tests for the hardware and/or tests for code that uses the hardware. Write tests that show how you expect to use the hardware and make sure it works as you expect. The hardware engineers might just thank you. Automated unit tests are more difficult to create when the hardware interacts with the real world. The tests may involve external instrumentation or manual verification. Consider a test for turning on an LED. You can write a test to turn on the LED, but you need someone s eyes, or some electrical or optical sensor to see if the LED is on. The later two options sound expensive. The former is time consuming. To minimize the manual tests, the hardware layer is made as thin as possible. We may never achieve 100% test automation; so we will strive to fully test the core of the application and manually test the final connections to the hardware. TDD for Embedded Software 6 of 15
7 With a fully functional target platform we can do end-to-end testing. Ideally the end-toend testing would be automated, but this is difficult and expensive to achieve in most cases. One big challenge in end-to-end testing is running the system through all the scenarios it has to support. Uncommon scenarios still have to work, so how do we get the system into a particular state and have the right triggering event to occur at exactly the right time? It turns out that controlling the system state and triggering certain events is easier in our test environments. Our mocked-out hardware implementations can be instructed to give the responses needed to exercise the obscure paths through the code. For example in the home security system, what if the phone dialer cannot get dial tone? How many retries do we attempt? How long does the system delay between retries? What if some alarm system models have the second phone line option, when do we call on the backup phone line? This sounds like an involved manual test. By using a mock phone dialer implementation this behavior can be easily tested. A dial tone failure can be faked and the system response can be monitored and confirmed. Summary 1. Add a test 2. See new test fail 3. Make change 4. See new test pass 5. Refactor 1. Compile for target 2. Fix compiler incompatibilities 1. Run unit tests in target 2. Fix execution problems 1. Run manual tests 2. Fix problems Every few minutes Every few hours Every couple days Every week This diagram represents the embedded TDD cycle. It is part of a quality improvement and risk reduction strategy to keep bugs out of the software, and helps keep the team from getting stalled. Manual test are too expensive to run frequently. Any change can introduce a killer bug. One problem with manual tests is that they have to be consistently set up and executed. They are repetitious and boring. They are unlikely to be run often enough. If you don t run them they cannot find problems. When they do find bugs it is often months after the bug was injected, so the time to fix the problem increases Therefore we want to TDD for Embedded Software 7 of 15
8 automate as many tests as possible. Automation has a cost, but I have found that writing automated tests is cheaper that not writing tests. The tests easily pay for themselves in less debug time. Using this Embedded Test Driven Development Cycle can provide embedded software engineers a valuable test bed for their software. Automated unit tests tell the programmer when their code is broken. Unit tests provide an example of how the code works and is therefore a valuable form of documentation. The tests are the first pace to look when trying to understand how a given module works. Unit tests are not an end in themselves. The system has to work and be delivered. Automated acceptance tests, load tests and timing tests are likely necessary, but a topic for another day. Appendix A Example TDD Session in C++ In this example we are going to develop something familiar to you all, a Stack using TDD. The objective of this is to give you the feel of TDD. All C++ TDD sessions start with three files. CppTestTools will generate the initial starting point. I used this CppTestTools command in the directory with my source code and makefile. NewClass Stack This creates three files: Stack.h, Stack.cpp, and StackTest.cpp. The script also updated the makefile in this directory. TDD for Embedded Software 8 of 15
9 We start with a very defensive class declaration, trying to prevent the C++ compiler from helping us too much. The constructor is explicit to prevent conversion automatic conversion if we were to change the Stack() signature to include a single parameter. If we want conversion, we will write tests for it and remove explicit. //Stack.cpp #include "Stack.h" Stack::Stack() Stack::~Stack() The destructor is virtual. If you are sure you won t inherit from this class, and you are really worried about the space, you can delete that keyword. //Stack.h #ifndef D_Stack_H #define D_Stack_H class Stack public: explicit Stack(); virtual ~Stack(); private: Stack(const Stack&); Stack& operator=(const Stack&); ; #endif // D_Stack_H The copy constructor and assignment operator are private and not implemented to prevent the compiler from generating those items for us. By hiding these, we essentially prohibit passing and returning objects by value, an easy and wasteful thing to accidentally do. //StackTest.cpp #include "UnitTestHarness/TestHarness.h" #include "Helpers/SimpleStringExtensions.h" #include "Stack.h" TDD for Embedded Software 9 of 15 [email protected] // to make sure this file gets linked in to your test main ESC Class #241 EXPORT_TEST_GROUP(Stack); namespace
10 Starter versions of the constructor and destructor are provided. Note they are always in the cpp file and not in the header. Event though these appear to be empty, there is compiler generated code between those curly braces. So we put it in the cpp file by default to keep the footprint small. If we were not talking embedded here, we might not care as much. Here is the initial failing tests case. When doing TDD, you only write production code when there is a failing test case. The TEST macro defines a test case. SetUp() is run before each TEST invocation, and TearDown() is run after each TEST s closing curly brace. This makes sure that our tests don t talk to each other and remain independent. Failure in TEST(Stack, Create) StackTest.cpp(24) Start here... Errors (1 failures, 1 tests, 1 ran, 0 checks, 0 ignored, 0 filtered out) Now that we have the boiler plate out of the way, we can get down to work. A good place to start is to make a list of the tests cases to write, and then order those tests such that we can start with the easier cases and work our way to the more difficult cases. This lets us examine the interface first and then work out the implementation details when we have a good idea of how to interact with the obejct. Test case brainstorm (and initial guess at ordering) Empty stack Not empty Push one item get it back with a Pop Mix up Pushes and Pops to exercise the stack Specify the stack size Full stack Push to a full stack Pop from an empty Stack We may not know what to do about some of these test cases, for example what should we do with a stack that has blown its top, or a programming error that results in popping an empty stack. We can start on the parts we understand and get answers for the other parts later. When a stack is created, it is empty, here is the test that guarantees that. TEST(Stack, Empty) CHECK(stack->IsEmpty()); TDD for Embedded Software 10 of 15
11 This test fails, it does not even compile, so we add just enough code to get the test to compile, then link, and fail. //add this to the header file bool IsEmpty(); //add this to the cpp file bool Stack::IsEmpty() return false; The failing test demonstrates that our new test is successfully installed in the test framework. Failure in TEST(Stack, Empty) StackTest.cpp(28) CHECK(stack->IsEmpty()) failed. Errors (1 failures, 2 tests, 2 ran, 1 checks, 0 ignored, 0 filtered out) Using the fake it til you make it technique, change the false to true and see the test pass. [BECK] OK (2 tests, 2 ran, 1 checks, 0 ignored, 0 filtered out) Don t let the faking it bother you. It was a very easy way to get the tests to pass, and we will write another test for the other side of the condition, not empty, and then we will have eliminate that fake it code. We continue with the flow: write a test, make it compile, make it link, make it fail and finally make it pass. The test: TEST(Stack, NotEmpty) stack->push(12); CHECK(!stack->IsEmpty()); TDD for Embedded Software 11 of 15
12 The header file changes: class Stack public: explicit Stack(); virtual ~Stack(); bool IsEmpty(); void Push(int); private: int index; ; Stack(const Stack&); Stack& operator=(const Stack&); The cpp file changes: Stack::Stack() : index(0) bool Stack::IsEmpty() return index == 0; void Stack::Push(int value) index++; The test result:... OK (3 tests, 3 ran, 2 checks, 0 ignored, 0 filtered out) You can see the fake went away and the real implementation took its place. It is still incomplete, but evolving and converging on the solution. You might think these tests are too trivial, and I would agree with you, except that more complexity is coming. The simple things as well as the complex things must work, we never know where we will insert a bug, so we continue to follow the cycle. We prevent a whole batch of simple TDD for Embedded Software 12 of 15
13 mistakes that may be very difficult to find when integrated with hundreds or thousands of lines of other code. Now let s get the Stack working for a single entry. This way we get the interface designed first, make sure the stack works for that simple case and have less code to write to get the more general/strenuous case to work. Her are our results. TEST(Stack, PopReturnsWhatWasPushed) stack->push(12); LONGS_EQUAL(12, stack->pop()); TEST(Stack, PushOnePopOneEmpty) stack->push(12); stack->pop(); CHECK(stack->IsEmpty()); The PushOnePopOneEmpty test was an after-thought; after we pop a stack with one item in it the stack should be empty, so we added that test case. That check could have gone in the PopReturnsWhatWasPushed test, but it is better to keep the test cases short and to the point. The header file changes: //Added int Pop(); The cpp file changes: void Stack::Push(int value) index++; int Stack::Pop() index--; return 12; There s that fake it in there again this time returning a hard-coded 12. Now we are ready to store values into the stack, I guarantee the fake it will be gone soon. We fake it to get feedback quickly. This also helps us to write more comprehensive tests TDD for Embedded Software 13 of 15
14 The test result:... OK (5 tests, 5 ran, 4 checks, 0 ignored, 0 filtered out) Finally we ll add the guts of the stack, but not before writing a test that exposes the current implementation s weakness. TEST(Stack, PushPopGeneralCase) stack->push(10); stack->push(11); stack->push(12); LONGS_EQUAL(12, stack->pop()); CHECK(!stack->IsEmpty()); LONGS_EQUAL(11, stack->pop()); CHECK(!stack->IsEmpty()); LONGS_EQUAL(10, stack->pop()); CHECK(stack->IsEmpty()); The header file changes: //added int values[10]; How many entries should there be in a stack? I think it should be decided at construction time. Instead of taking the tangent to get an allocated buffer we made a simplifying assumption and finished the test. Maybe we should do capacity next. The cpp file changes: void Stack::Push(int value) values[index++] = value; int Stack::Pop() return values[--index]; Notice there are no boundary checks. Those will go in when we have written the tests for them. By the way: I got the --index backwards at first. Those kinds of mistakes are very common, and can be very difficult to find in the presence of thousands of lines of code. TDD for Embedded Software 14 of 15
15 My tests yelled at me like this:. Failure in TEST(Stack, PushPopGeneralCase) StackTest.cpp(55) expected <12> but was <0>.. Failure in TEST(Stack, PopReturnsWhatWasPushed) StackTest.cpp(40) expected <12> but was <4>... Errors (2 failures, 6 tests, 6 ran, 5 checks, 0 ignored, 0 filtered out) After fixing that small mistake I was back with all tests running.... OK (6 tests, 6 ran, 10 checks, 0 ignored, 0 filtered out) This TDD walk through was intended to show the tight feedback loop experienced and the high test coverage that is possible when doing TDD. Stack is a very simple example, and starting with something simple is a good way to learn a new skill. Give it a try, finish this example. [GANSSLE] Ganssle, Jack, The Art of Designing Embedded Systems, Butterworth-Heinemann, Woburn MA, p.48 [GREN-AGL] Grenning, James, Agile Software Development for Embedded Software, ESC-349, San Jose 2007 [BECK] Beck, Kent, Test Driven Development By Example, Addison Wesley, 2003 [MACKINNON Tim Mackinnon, Steve Freeman, Philip Craig, Endo-Testing: Unit Testing with Mock Objects ([email protected], [email protected], [email protected]) [CPPTEST] CppTestTools are open source and can be found at [GRENNING] Grenning, James, Progress Before Hardware, TDD for Embedded Software 15 of 15
Extreme Programming and Embedded Software Development
Extreme Programming and Embedded Software Development By James Grenning Every time I do a project, it seems we don t get the hardware until late in the project. This limits the progress the team can make.
Test Driven Development Part III: Continuous Integration Venkat Subramaniam [email protected] http://www.agiledeveloper.com/download.
Test Driven Development Part III: Continuous Integration Venkat Subramaniam [email protected] http://www.agiledeveloper.com/download.aspx Abstract In this final part of the three part series on
Testing Rails. by Josh Steiner. thoughtbot
Testing Rails by Josh Steiner thoughtbot Testing Rails Josh Steiner April 10, 2015 Contents thoughtbot Books iii Contact us................................ iii Introduction 1 Why test?.................................
Secrets to Automation Success. A White Paper by Paul Merrill, Consultant and Trainer at Beaufort Fairmont, LLC
5 Secrets to Automation Success A White Paper by Paul Merrill, Consultant and Trainer at Beaufort Fairmont, LLC 5 Secrets to Automated Testing Success 2 Secret #1 Practice Exceptional Leadership If you
Agile.NET Development Test-driven Development using NUnit
Agile.NET Development Test-driven Development using NUnit Jason Gorman Test-driven Development Drive the design and construction of your code on unit test at a time Write a test that the system currently
Java: Learning to Program with Robots. Chapter 11: Building Quality Software
Java: Learning to Program with Robots Chapter 11: Building Quality Software Chapter Objectives After studying this chapter, you should be able to: Identify characteristics of quality software, both from
TESTING FRAMEWORKS. Gayatri Ghanakota
TESTING FRAMEWORKS Gayatri Ghanakota OUTLINE Introduction to Software Test Automation. What is Test Automation. Where does Test Automation fit in the software life cycle. Why do we need test automation.
Storage Classes CS 110B - Rule Storage Classes Page 18-1 \handouts\storclas
CS 110B - Rule Storage Classes Page 18-1 Attributes are distinctive features of a variable. Data type, int or double for example, is an attribute. Storage class is another attribute. There are four storage
Using Karel with Eclipse
Mehran Sahami Handout #6 CS 106A September 23, 2015 Using Karel with Eclipse Based on a handout by Eric Roberts Once you have downloaded a copy of Eclipse as described in Handout #5, your next task is
SEEM4570 System Design and Implementation Lecture 10 Software Development Process
SEEM4570 System Design and Implementation Lecture 10 Software Development Process Software Development A software development process: A structure imposed on the development of a software product Also
Chapter 8 Software Testing
Chapter 8 Software Testing Summary 1 Topics covered Development testing Test-driven development Release testing User testing 2 Program testing Testing is intended to show that a program does what it is
THE OPTIMIZER HANDBOOK:
THE OPTIMIZER HANDBOOK: LEAD SCORING Section 1: What is Lead Scoring? Picture this: you re selling vehicles, and you have a list that features over two hundred different leads, but you re only allowed
SPECIFICATION BY EXAMPLE. Gojko Adzic. How successful teams deliver the right software. MANNING Shelter Island
SPECIFICATION BY EXAMPLE How successful teams deliver the right software Gojko Adzic MANNING Shelter Island Brief Contents 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 Preface xiii Acknowledgments xxii
Levels of Software Testing. Functional Testing
Levels of Software Testing There are different levels during the process of Testing. In this chapter a brief description is provided about these levels. Levels of testing include the different methodologies
Git Branching for Continuous Delivery
Git Branching for Continuous Delivery Sarah Goff-Dupont Automation Enthusiast Hello everyone I ll be talking about how teams at Atlassian use Git branches for continuous delivery. My name is Sarah, and
New Generation of Software Development
New Generation of Software Development Terry Hon University of British Columbia 201-2366 Main Mall Vancouver B.C. V6T 1Z4 [email protected] ABSTRACT In this paper, I present a picture of what software development
Benefits of Test Automation for Agile Testing
Benefits of Test Automation for Agile Testing Manu GV 1, Namratha M 2, Pradeep 3 1 Technical Lead-Testing Calsoft Labs, Bangalore, India 2 Assistant Professor, BMSCE, Bangalore, India 3 Software Engineer,
Test Driven Development
Test Driven Development Introduction Test Driven development (TDD) is a fairly recent (post 2000) design approach that originated from the Extreme Programming / Agile Methodologies design communities.
September 18, 2014. Modular development in Magento 2. Igor Miniailo Magento
September 18, 2014 Modular development in Magento 2 Igor Miniailo Magento Agenda 1 Magento 2 goals 2 Magento 1 modules 3 Decoupling techniques 4 Magento 2 is it getting better? 5 Modularity examples Magento
Assignment # 2: Design Patterns and GUIs
CSUS COLLEGE OF ENGINEERING AND COMPUTER SCIENCE Department of Computer Science CSc 133 Object-Oriented Computer Graphics Programming Spring 2014 John Clevenger Assignment # 2: Design Patterns and GUIs
Object Oriented Software Design II
Object Oriented Software Design II Introduction to C++ Giuseppe Lipari http://retis.sssup.it/~lipari Scuola Superiore Sant Anna Pisa February 20, 2012 G. Lipari (Scuola Superiore Sant Anna) C++ Intro February
DocAve 6 Service Pack 1 Administrator
DocAve 6 Service Pack 1 Administrator User Guide Revision C Issued October 2012 1 Table of Contents Table of Contents... 2 About DocAve Administrator for SharePoint... 6 Complementary Products... 6 Submitting
(Refer Slide Time: 01:52)
Software Engineering Prof. N. L. Sarda Computer Science & Engineering Indian Institute of Technology, Bombay Lecture - 2 Introduction to Software Engineering Challenges, Process Models etc (Part 2) This
Email Marketing Now let s get started on probably the most important part probably it is the most important part of this system and that s building your e-mail list. The money is in the list, the money
Test-Driven Development
Test-Driven Development An Introduction Mattias Ståhlberg [email protected] Debugging sucks. Testing rocks. Contents 1. What is unit testing? 2. What is test-driven development? 3. Example 4.
Decomposition into Parts. Software Engineering, Lecture 4. Data and Function Cohesion. Allocation of Functions and Data. Component Interfaces
Software Engineering, Lecture 4 Decomposition into suitable parts Cross cutting concerns Design patterns I will also give an example scenario that you are supposed to analyse and make synthesis from The
Line Tracking Basic Lesson
Line Tracking Basic Lesson Now that you re familiar with a few of the key NXT sensors, let s do something a little more interesting with them. This lesson will show you how to use the Light Sensor to track
Software Engineering Techniques
Software Engineering Techniques Low level design issues for programming-in-the-large. Software Quality Design by contract Pre- and post conditions Class invariants Ten do Ten do nots Another type of summary
AnswerNow Guides Why Live Service Matters!
Consider this: a 2% increase in customer retention has the same effect as cutting costs by 10%. That means that simply by keeping a small number of your customers from jumping ship, you can save money
Engineering Process Software Qualities Software Architectural Design
Engineering Process We need to understand the steps that take us from an idea to a product. What do we do? In what order do we do it? How do we know when we re finished each step? Production process Typical
Insight Guide. E-Learning Compliance. www.kineo.com
Insight Guide E-Learning Compliance LAST MENU BACK NEXT Insight Guide Overview The challenges of compliance training Questions to ask before you begin your design 20 minutes A new generation of design
PostgreSQL Concurrency Issues
PostgreSQL Concurrency Issues 1 PostgreSQL Concurrency Issues Tom Lane Red Hat Database Group Red Hat, Inc. PostgreSQL Concurrency Issues 2 Introduction What I want to tell you about today: How PostgreSQL
Merlin A Continuous Integration Tool for VisualWorks
Merlin A Continuous Integration Tool for VisualWorks Michael Meyer November 23, 2005 1 Contents Contents 1. Continuous Integration 3 1.1. Definition.................................... 3 1.2. The benefit...................................
Code Qualities and Coding Practices
Code Qualities and Coding Practices Practices to Achieve Quality Scott L. Bain and the Net Objectives Agile Practice 13 December 2007 Contents Overview... 3 The Code Quality Practices... 5 Write Tests
Exploratory Testing in an Agile Context
Exploratory Testing in an Agile Context A guide to using Exploratory Testing on Agile software development teams. Elisabeth Hendrickson 2 Exploratory Testing. So you bang on the keyboard randomly, right?
Upping the game. Improving your software development process
Upping the game Improving your software development process John Ferguson Smart Principle Consultant Wakaleo Consulting Email: [email protected] Web: http://www.wakaleo.com Twitter: wakaleo Presentation
User Stories Applied
User Stories Applied for Agile Software Development Mike Cohn Boston San Francisco New York Toronto Montreal London Munich Paris Madrid Capetown Sydney Tokyo Singapore Mexico City Chapter 2 Writing Stories
Week 2 Practical Objects and Turtles
Week 2 Practical Objects and Turtles Aims and Objectives Your aim in this practical is: to practise the creation and use of objects in Java By the end of this practical you should be able to: create objects
How To Write A Design Document For Anorexic Css
Computer Science 161: Operating Systems How to write a Design Document CS161 Course Staff [email protected] January 22, 2013 1 Introduction Assignments 2, 3, and 4 require that you write and submit
Agile Power Tools. Author: Damon Poole, Chief Technology Officer
Agile Power Tools Best Practices of Agile Tool Users Author: Damon Poole, Chief Technology Officer Best Practices of Agile Tool Users You ve decided to transition to Agile development. Everybody has been
An Example Checklist for ScrumMasters
An Example Checklist for ScrumMasters Michael James ([email protected]) 14 September 2007 (Revised 24 July 2012) A Full Time Facilitator? An adequate ScrumMaster can handle two or three teams at a time.
Tutorial: Getting Started
9 Tutorial: Getting Started INFRASTRUCTURE A MAKEFILE PLAIN HELLO WORLD APERIODIC HELLO WORLD PERIODIC HELLO WORLD WATCH THOSE REAL-TIME PRIORITIES THEY ARE SERIOUS SUMMARY Getting started with a new platform
Environment Modeling for Automated Testing of Cloud Applications
Environment Modeling for Automated Testing of Cloud Applications Linghao Zhang, Tao Xie, Nikolai Tillmann, Peli de Halleux, Xiaoxing Ma, Jian Lv {lzhang25, txie}@ncsu.edu, {nikolait, jhalleux}@microsoft.com,
Best Practices for Improving the Quality and Speed of Your Agile Testing
A Conformiq White Paper Best Practices for Improving the Quality and Speed of Your Agile Testing Abstract With today s continually evolving digital business landscape, enterprises are increasingly turning
Getting Started with STATISTICA Enterprise Programming
Getting Started with STATISTICA Enterprise Programming 2300 East 14th Street Tulsa, OK 74104 Phone: (918) 749 1119 Fax: (918) 749 2217 E mail: mailto:[email protected] Web: www.statsoft.com
Basic Unix/Linux 1. Software Testing Interview Prep
Basic Unix/Linux 1 Programming Fundamentals and Concepts 2 1. What is the difference between web application and client server application? Client server application is designed typically to work in a
EXAM FOR INFOTECH SOFTWARE ENGINEERING FOR REAL-TIME SYSTEMS. Suggested Solution WS 13/14. - Without Engagement -
EXAM FOR INFOTECH SOFTWARE ENGINEERING FOR REAL-TIME SYSTEMS Suggested Solution WS 13/14 - Without Engagement - Task Theme Points Time required in min. 1 Analysis and Design 15 30 2 Basics and Test 10
Test Data Management Best Practice
Test Data Management Best Practice, Inc. 5210 Belfort Parkway, Suite 400 Author: Stephanie Chace Quality Practice Lead [email protected], Inc. 2011 www.meridiantechnologies.net Table of
A D M I N I S T R A T O R V 1. 0
A D M I N I S T R A T O R F A Q V 1. 0 2011 Fastnet SA, St-Sulpice, Switzerland. All rights reserved. Reproduction in whole or in part in any form of this manual without written permission of Fastnet SA
F Cross-system event-driven scheduling. F Central console for managing your enterprise. F Automation for UNIX, Linux, and Windows servers
F Cross-system event-driven scheduling F Central console for managing your enterprise F Automation for UNIX, Linux, and Windows servers F Built-in notification for Service Level Agreements A Clean Slate
Getting off the ground when creating an RVM test-bench
Getting off the ground when creating an RVM test-bench Rich Musacchio, Ning Guo Paradigm Works [email protected],[email protected] ABSTRACT RVM compliant environments provide
Jonathan Worthington Scarborough Linux User Group
Jonathan Worthington Scarborough Linux User Group Introduction What does a Virtual Machine do? Hides away the details of the hardware platform and operating system. Defines a common set of instructions.
Clear and Present Payments Danger: Fraud Shifting To U.S., Getting More Complex
Clear and Present Payments Danger: Fraud Shifting To U.S., Getting More Complex Q: Good morning, this is Alex Walsh at PYMNTS.com. I m joined by David Mattei, the vice president and product manager for
Module 10. Coding and Testing. Version 2 CSE IIT, Kharagpur
Module 10 Coding and Testing Lesson 23 Code Review Specific Instructional Objectives At the end of this lesson the student would be able to: Identify the necessity of coding standards. Differentiate between
SAS, Excel, and the Intranet
SAS, Excel, and the Intranet Peter N. Prause, The Hartford, Hartford CT Charles Patridge, The Hartford, Hartford CT Introduction: The Hartford s Corporate Profit Model (CPM) is a SAS based multi-platform
API Architecture. for the Data Interoperability at OSU initiative
API Architecture for the Data Interoperability at OSU initiative Introduction Principles and Standards OSU s current approach to data interoperability consists of low level access and custom data models
Advanced Web Security, Lab
Advanced Web Security, Lab Web Server Security: Attacking and Defending November 13, 2013 Read this earlier than one day before the lab! Note that you will not have any internet access during the lab,
C++ INTERVIEW QUESTIONS
C++ INTERVIEW QUESTIONS http://www.tutorialspoint.com/cplusplus/cpp_interview_questions.htm Copyright tutorialspoint.com Dear readers, these C++ Interview Questions have been designed specially to get
INTEGRATING MICROSOFT DYNAMICS CRM WITH SIMEGO DS3
INTEGRATING MICROSOFT DYNAMICS CRM WITH SIMEGO DS3 Often the most compelling way to introduce yourself to a software product is to try deliver value as soon as possible. Simego DS3 is designed to get you
Java course - IAG0040. Unit testing & Agile Software Development
Java course - IAG0040 Unit testing & Agile Software Development 2011 Unit tests How to be confident that your code works? Why wait for somebody else to test your code? How to provide up-to-date examples
Introduction. What is RAID? The Array and RAID Controller Concept. Click here to print this article. Re-Printed From SLCentral
Click here to print this article. Re-Printed From SLCentral RAID: An In-Depth Guide To RAID Technology Author: Tom Solinap Date Posted: January 24th, 2001 URL: http://www.slcentral.com/articles/01/1/raid
Staying Organized with the Outlook Journal
CHAPTER Staying Organized with the Outlook Journal In this chapter Using Outlook s Journal 362 Working with the Journal Folder 364 Setting Up Automatic Email Journaling 367 Using Journal s Other Tracking
An Introduction to MPLAB Integrated Development Environment
An Introduction to MPLAB Integrated Development Environment 2004 Microchip Technology Incorporated An introduction to MPLAB Integrated Development Environment Slide 1 This seminar is an introduction to
Software Engineering Introduction & Background. Complaints. General Problems. Department of Computer Science Kent State University
Software Engineering Introduction & Background Department of Computer Science Kent State University Complaints Software production is often done by amateurs Software development is done by tinkering or
Software Testing. Knowledge Base. Rajat Kumar Bal. Introduction
Software Testing Rajat Kumar Bal Introduction In India itself, Software industry growth has been phenomenal. IT field has enormously grown in the past 50 years. IT industry in India is expected to touch
Introduction to Microsoft Access 2003
Introduction to Microsoft Access 2003 Zhi Liu School of Information Fall/2006 Introduction and Objectives Microsoft Access 2003 is a powerful, yet easy to learn, relational database application for Microsoft
INTRODUCING CONTINUOUS DELIVERY IN THE ENTERPRISE
INTRODUCING CONTINUOUS DELIVERY IN THE ENTERPRISE The situation Today Not too long ago customers and prospects had to find a computer to visit your site. In stark contrast with just a few years ago, this
AGILE vs. WATERFALL METHODOLOGIES
AGILE vs. WATERFALL METHODOLOGIES Introduction Agile and waterfall are two major methodologies that software developers and project managers have the option of using. Some of the goals of developers and
Foundations for Systems Development
Foundations for Systems Development ASSIGNMENT 1 Read this assignment introduction. Then, read Chapter 1, The Systems Development Environment, on pages 2 25 in your textbook. What Is Systems Analysis and
Pipeline Orchestration for Test Automation using Extended Buildbot Architecture
Pipeline Orchestration for Test Automation using Extended Buildbot Architecture Sushant G.Gaikwad Department of Computer Science and engineering, Walchand College of Engineering, Sangli, India. M.A.Shah
www.mainelectronics.com
HOW TO PROGRAM A DSC SYSTEM A TUTORIAL Our goal is to show you how to enter values into the DSC operating system, not to tell you what those values should be (although we will include some examples of
Automated Testing Best Practices
Automated Testing Best Practices This document includes best practices to consider before implementing automated software testing. These best practices are strategic and are applicable regardless of the
Enterprise Job Scheduling: How Your Organization Can Benefit from Automation
WHITE PAPER Enterprise Job Scheduling: How Your Organization Can Benefit from Automation By Pat Cameron Introduction Today's companies need automation solutions to attain the high levels of availability,
Code Refactoring and Defects
Code Refactoring and Defects Reusing this material This work is licensed under a Creative Commons Attribution- NonCommercial-ShareAlike 4.0 International License. http://creativecommons.org/licenses/by-nc-sa/4.0/deed.en_us
N-CAP Users Guide Everything You Need to Know About Using the Internet! How Firewalls Work
N-CAP Users Guide Everything You Need to Know About Using the Internet! How Firewalls Work How Firewalls Work By: Jeff Tyson If you have been using the internet for any length of time, and especially if
Why Test Automation Fails
Why Test Automation Fails in Theory and in Practice Jim Trentadue Enterprise Account Manager- Ranorex [email protected] Thursday, January 15, 2015 Agenda Agenda Test Automation Industry recap Test
Agile Testing Overview
Copyright (c) 2008, Quality Tree Software, Inc. 1 Agile Myths, Busted Contrary to popular myth, Agile methods are not sloppy, ad hoc, do-whatever-feelsgood processes. Quite the contrary. As Mary Poppendieck
Keywords document, agile documentation, documentation, Techno functional expert, Team Collaboration, document selection;
Volume 4, Issue 4, April 2014 ISSN: 2277 128X International Journal of Advanced Research in Computer Science and Software Engineering Research Paper Available online at: www.ijarcsse.com A Document Driven
The Comprehensive Interview
Uncovering the Real Candidate Behind the Interview Persona Janna Mansker Kelly Land www.berkeassessment.com The Comprehensive Interview When sitting across the table from a candidate during an interview,
MF Digital 5000 USB SD Platform Series Operating Manual
MF Digital 5000 USB SD Platform Series Operating Manual MF Digital A Division of Formats Unlimited, Inc 155 Sherwood Avenue Farmingdale, NY 11735 T: +1 631 249 9393 F: +1 631 249 9273 Authors: Robert Warnock
Copyright (c) 2015 Christopher Small and The Art of Lawyering. All rights reserved.
Copyright (c) 2015 Christopher Small and The Art of Lawyering. All rights reserved. 1 In this special report, I ll be sharing with you the ten biggest mistakes that lawyers make when marketing their law
Agile Techniques for Object Databases
db4o The Open Source Object Database Java and.net Agile Techniques for Object Databases By Scott Ambler 1 Modern software processes such as Rational Unified Process (RUP), Extreme Programming (XP), and
MAS 90 MAS 200 Tips, Tricks and Frequently Asked Questions (FAQ s) Prepared by: The Fitzgerald Group August 11, 2004
MAS 90 MAS 200 Tips, Tricks and Frequently Asked Questions (FAQ s) Prepared by: The Fitzgerald Group August 11, 2004 This is a compilation of ideas from The Fitzgerald Group staff, from clients and from
JOURNAL OF OBJECT TECHNOLOGY
JOURNAL OF OBJECT TECHNOLOGY Online at http://www.jot.fm. Published by ETH Zurich, Chair of Software Engineering JOT, 2006 Vol. 5, No. 6, July - August 2006 On Assuring Software Quality and Curbing Software
KITES TECHNOLOGY COURSE MODULE (C, C++, DS)
KITES TECHNOLOGY 360 Degree Solution www.kitestechnology.com/academy.php [email protected] [email protected] Contact: - 8961334776 9433759247 9830639522.NET JAVA WEB DESIGN PHP SQL, PL/SQL
Computer Programming In QBasic
Computer Programming In QBasic Name: Class ID. Computer# Introduction You've probably used computers to play games, and to write reports for school. It's a lot more fun to create your own games to play
A deeper look at Inline functions
A deeper look at Inline functions I think it s safe to say that all Overload readers know what C++ inline functions are. When we declare a function or member function as inline we are trying to avoid the
